sculpt: runtime view

This patch adds a graph of the current runtime state to the
leitzentrale. The topology of the graph depends on the first routing
rule of each component. For this reason, the patch re-orders routing
policies to make the most important route the first in the list.

The user can switch between the runtime view and the inspect window
by clicking on the corresponding menu dialogs. E.g., a click on the
storage dialog reveals the inspect window.
This commit is contained in:
Norman Feske 2018-07-05 16:57:43 +02:00 committed by Christian Helmuth
parent 40a84e0c81
commit cdef4c2548
23 changed files with 394 additions and 75 deletions

View File

@ -15,6 +15,7 @@ import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/libc \
[depot_user]/src/wm \
[depot_user]/src/themed_decorator \
[depot_user]/src/nic_router \
[depot_user]/src/nit_fb \
[depot_user]/src/nit_fader \
[depot_user]/src/libpng \
@ -83,6 +84,8 @@ install_config {
report="nitpicker -> hover"/>
<policy label="leitzentrale -> manager -> displays"
report="nitpicker -> displays"/>
<policy label="runtime -> runtime_view -> dialog"
report="leitzentrale -> manager -> runtime_view_dialog"/>
</config>
</start>
@ -146,6 +149,7 @@ install_config {
<provides> <service name="File_system"/> </provides>
<config>
<default-policy root="/" writeable="yes"/>
<content> <inline name="log">See the core log for messages.</inline> </content>
</config>
</start>
@ -230,6 +234,8 @@ install_config {
<child name="config_fs" label="rw"/> </service>
<service name="File_system" label="report">
<child name="report_fs" label="rw"/> </service>
<service name="Report" label="manager -> runtime_view_dialog">
<child name="report_rom"/> </service>
<service name="Report"> <child name="fs_report"/> </service>
<service name="ROM" label_last="drivers/block_devices">
<parent label="block_devices"/> </service>
@ -259,6 +265,8 @@ install_config {
<child name="config_rom" label="managed/runtime"/> </service>
<service name="ROM" label_prefix="config -> ">
<child name="config_rom"/> </service>
<service name="ROM" label="runtime_view -> dialog">
<child name="report_rom"/> </service>
<service name="File_system" label="config">
<child name="config_fs" label="rw"/> </service>
<service name="File_system" label="report">
@ -266,7 +274,6 @@ install_config {
<service name="Block" label_last="ahci-1"> <child name="ahci-1"/> </service>
<service name="Block" label_last="ahci-2"> <child name="ahci-2"/> </service>
<service name="Block"> <child name="drivers"/> </service>
<service name="Usb"> <child name="drivers"/> </service>
<service name="Nitpicker" label_prefix="leitzentrale">
<child name="leitzentrale"/> </service>
<service name="Nitpicker"> <child name="nitpicker"/> </service>

View File

@ -70,6 +70,8 @@ install_config {
report="global_keys_handler -> slides"/>
<policy label="leitzentrale -> manager -> displays"
report="nitpicker -> displays"/>
<policy label="runtime -> runtime_view -> dialog"
report="leitzentrale -> manager -> runtime_view_dialog"/>
</config>
</start>
@ -381,6 +383,8 @@ install_config {
<child name="config_fs_rom"/> </service>
<service name="ROM" label="manager -> nitpicker_hover">
<child name="report_rom"/> </service>
<service name="Report" label="manager -> runtime_view_dialog">
<child name="report_rom"/> </service>
<service name="Report"> <child name="fs_report"/> </service>
<service name="Nitpicker"> <child name="nitpicker"/> </service>
<service name="Timer"> <child name="timer"/> </service>
@ -411,6 +415,8 @@ install_config {
<child name="report_rom"/> </service>
<service name="ROM" label="clicked">
<child name="report_rom"/> </service>
<service name="ROM" label="runtime_view -> dialog">
<child name="report_rom"/> </service>
<service name="File_system" label="config">
<child name="config_fs" label="rw"/> </service>
<service name="File_system" label="report">

View File

@ -90,16 +90,16 @@
<service name="ROM"/>
</provides>
<config verbose="no">
<policy label="decorator -> window_layout" report="manager -> window_layout"/>
<policy label="wm -> resize_request" report="manager -> window_layout"/>
<policy label="wm -> focus" report="manager -> wm_focus"/>
<policy label="decorator -> pointer" report="wm -> pointer"/>
<policy label="gui -> config" report="manager -> gui_config"/>
<policy label="gui -> menu_view -> dialog" report="manager -> menu_dialog"/>
<policy label="manager -> menu_view_hover" report="gui -> menu_view -> hover"/>
<policy label="manager -> window_list" report="wm -> window_list"/>
<policy label="manager -> decorator_margins" report="decorator -> decorator_margins"/>
<policy label="nitpicker -> focus" report="manager -> focus"/>
<policy label="decorator -> window_layout" report="manager -> window_layout"/>
<policy label="wm -> resize_request" report="manager -> window_layout"/>
<policy label="wm -> focus" report="manager -> wm_focus"/>
<policy label="decorator -> pointer" report="wm -> pointer"/>
<policy label="gui -> config" report="manager -> gui_config"/>
<policy label="gui -> menu -> dialog" report="manager -> menu_dialog"/>
<policy label="manager -> menu_view_hover" report="gui -> menu -> hover"/>
<policy label="manager -> window_list" report="wm -> window_list"/>
<policy label="manager -> decorator_margins" report="decorator -> decorator_margins"/>
<policy label="nitpicker -> focus" report="manager -> focus"/>
</config>
</start>
@ -180,6 +180,7 @@
<child name="config_fs_report" label="managed -> installation"/> </service>
<service name="Report" label="depot_query">
<child name="config_fs_report" label="managed -> depot_query"/> </service>
<service name="Report" label="runtime_view_dialog"> <parent/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<service name="ROM" label="nitpicker_hover"> <parent/> </service>
<service name="ROM" label_prefix="report ->"> <parent/> </service>

View File

@ -0,0 +1,155 @@
/*
* \brief Graph view of runtime state
* \author Norman Feske
* \date 2018-07-05
*
* The GUI is based on a dynamically configured init component, which hosts
* one menu-view component for each dialog.
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _GRAPH_H_
#define _GRAPH_H_
/* Genode includes */
#include <os/reporter.h>
/* local includes */
#include <types.h>
#include <xml.h>
namespace Sculpt { struct Graph; }
struct Sculpt::Graph
{
Env &_env;
Storage_target const &_sculpt_partition;
Expanding_reporter _graph_dialog_reporter { _env, "dialog", "runtime_view_dialog" };
/*
* Even though the runtime configuration is generate by the sculpt
* manager, we still obtain it as a separate ROM session to keep both
* parts decoupled.
*/
Attached_rom_dataspace _runtime_config_rom { _env, "config -> managed/runtime" };
Signal_handler<Graph> _runtime_config_handler {
_env.ep(), *this, &Graph::_handle_runtime_config };
typedef Start_name Node_name;
/**
* Return component name targeted by the first route of the start node
*/
static Node_name _primary_dependency(Xml_node const start)
{
if (!start.has_sub_node("route"))
return Node_name();
Xml_node const route = start.sub_node("route");
if (!route.has_sub_node("service"))
return Node_name();
Xml_node const service = route.sub_node("service");
if (service.has_sub_node("child")) {
Xml_node const child = service.sub_node("child");
return child.attribute_value("name", Node_name());
}
return Node_name();
}
template <typename FN>
static void _for_each_secondary_dep(Xml_node const start, FN const &fn)
{
if (!start.has_sub_node("route"))
return;
Xml_node const route = start.sub_node("route");
bool first_route = true;
route.for_each_sub_node("service", [&] (Xml_node service) {
if (!service.has_sub_node("child"))
return;
if (!first_route) {
Xml_node const child = service.sub_node("child");
fn(child.attribute_value("name", Start_name()));
}
first_route = false;
});
}
void _handle_runtime_config()
{
_runtime_config_rom.update();
Xml_node const config = _runtime_config_rom.xml();
_graph_dialog_reporter.generate([&] (Xml_generator &xml) {
xml.node("depgraph", [&] () {
config.for_each_sub_node("start", [&] (Xml_node start) {
Start_name const name = start.attribute_value("name", Start_name());
gen_named_node(xml, "frame", name, [&] () {
Node_name primary_dep = _primary_dependency(start);
if (primary_dep == "default_fs_rw")
primary_dep = _sculpt_partition.fs();
if (primary_dep.valid())
xml.attribute("dep", primary_dep);
gen_named_node(xml, "button", name, [&] () {
xml.node("label", [&] () {
xml.attribute("text", name);
});
});
});
});
config.for_each_sub_node("start", [&] (Xml_node start) {
Start_name const name = start.attribute_value("name", Start_name());
bool const show_details = false;
if (show_details) {
_for_each_secondary_dep(start, [&] (Start_name const &dep) {
xml.node("dep", [&] () {
xml.attribute("node", name);
xml.attribute("on", dep);
});
});
}
});
});
});
}
Graph(Env &env, Storage_target const &sculpt_partition)
:
_env(env), _sculpt_partition(sculpt_partition)
{
_runtime_config_rom.sigh(_runtime_config_handler);
}
};
#endif /* _GRAPH_H_ */

View File

@ -104,6 +104,6 @@ void Sculpt::Gui::_generate_config(Xml_generator &xml) const
});
xml.node("start", [&] () {
_gen_menu_view_start_content(xml, "menu_view", Point(0, 0)); });
_gen_menu_view_start_content(xml, "menu", Point(0, 0)); });
}

View File

@ -33,6 +33,8 @@ struct Sculpt::Gui
Expanding_reporter _config { _env, "config", "gui_config" };
float _font_size_px = 14;
typedef String<32> Label;
struct Version { unsigned value; } version { 0 };
@ -48,8 +50,11 @@ struct Sculpt::Gui
_config.generate([&] (Xml_generator &xml) { _generate_config(xml); });
}
float font_size() const { return _font_size_px; }
void font_size(float px)
{
_font_size_px = px;
menu_width = max(px*21, 320.0);
}

View File

@ -31,6 +31,7 @@
#include <network.h>
#include <storage.h>
#include <deploy.h>
#include <graph.h>
namespace Sculpt { struct Main; }
@ -184,14 +185,14 @@ struct Sculpt::Main : Input_event_handler,
Gui _gui { _env };
Expanding_reporter _dialog_reporter { _env, "dialog", "menu_dialog" };
Expanding_reporter _menu_dialog_reporter { _env, "dialog", "menu_dialog" };
Attached_rom_dataspace _hover_rom { _env, "menu_view_hover" };
Signal_handler<Main> _hover_handler {
_env.ep(), *this, &Main::_handle_hover };
struct Hovered { enum Dialog { NONE, STORAGE, NETWORK } value; };
struct Hovered { enum Dialog { NONE, LOGO, STORAGE, NETWORK, RUNTIME } value; };
Hovered::Dialog _hovered_dialog { Hovered::NONE };
@ -209,7 +210,7 @@ struct Sculpt::Main : Input_event_handler,
*/
void generate_dialog() override
{
_dialog_reporter.generate([&] (Xml_generator &xml) {
_menu_dialog_reporter.generate([&] (Xml_generator &xml) {
xml.node("vbox", [&] () {
gen_named_node(xml, "frame", "logo", [&] () {
@ -220,7 +221,10 @@ struct Sculpt::Main : Input_event_handler,
if (_manually_managed_runtime)
return;
_storage.dialog.generate(xml);
bool const storage_dialog_expanded = _last_clicked == Hovered::STORAGE
|| !_storage.any_file_system_inspected();
_storage.dialog.generate(xml, storage_dialog_expanded);
_network.dialog.generate(xml);
gen_named_node(xml, "frame", "runtime", [&] () {
@ -276,14 +280,23 @@ struct Sculpt::Main : Input_event_handler,
Keyboard_focus _keyboard_focus { _env, _network.dialog, _network.wpa_passphrase };
Hovered::Dialog _last_clicked { Hovered::NONE };
/**
* Input_event_handler interface
*/
void handle_input_event(Input::Event const &ev) override
{
if (ev.key_press(Input::BTN_LEFT)) {
if (_hovered_dialog != _last_clicked && _hovered_dialog != Hovered::NONE) {
_last_clicked = _hovered_dialog;
_handle_window_layout();
}
if (_hovered_dialog == Hovered::STORAGE) _storage.dialog.click(_storage);
if (_hovered_dialog == Hovered::NETWORK) _network.dialog.click(_network);
if (_hovered_dialog == Hovered::RUNTIME) _network.dialog.click(_network);
}
if (ev.key_release(Input::BTN_LEFT))
@ -359,6 +372,14 @@ struct Sculpt::Main : Input_event_handler,
Expanding_reporter _window_layout { _env, "window_layout", "window_layout" };
/*******************
** Runtime graph **
*******************/
Graph _graph { _env, _storage._sculpt_partition };
Main(Env &env) : _env(env)
{
_runtime_state_rom.sigh(_runtime_state_handler);
@ -423,7 +444,9 @@ void Sculpt::Main::_handle_window_layout()
Framebuffer::Mode const mode = _nitpicker->mode();
typedef Nitpicker::Rect Rect;
typedef Nitpicker::Rect Rect;
typedef Nitpicker::Area Area;
typedef Nitpicker::Point Point;
Rect avail(Point(_gui.menu_width, 0),
Point(mode.width() - 1, mode.height() - 1));
@ -456,7 +479,8 @@ void Sculpt::Main::_handle_window_layout()
: Point(log_p2.x(), log_p1.y() - margins.bottom - margins.top - 1);
typedef String<128> Label;
Label const inspect_label("runtime -> leitzentrale -> storage browser");
Label const inspect_label ("runtime -> leitzentrale -> inspect");
Label const runtime_view_label("runtime -> leitzentrale -> runtime_view");
_window_list.update();
_window_layout.generate([&] (Xml_generator &xml) {
@ -481,7 +505,23 @@ void Sculpt::Main::_handle_window_layout()
};
gen_matching_window("log", Rect(log_p1, log_p2));
gen_matching_window(inspect_label, Rect(inspect_p1, inspect_p2));
if (label == runtime_view_label) {
/* center runtime view within the available main (inspect) area */
unsigned const inspect_w = inspect_p2.x() - inspect_p1.x(),
inspect_h = inspect_p2.y() - inspect_p1.y();
Area const size(min(inspect_w, win.attribute_value("width", 0UL)),
min(inspect_h, win.attribute_value("height", 0UL)));
Point const pos = Rect(inspect_p1, inspect_p2).center(size);
gen_matching_window(runtime_view_label, Rect(pos, size));
}
if (_last_clicked == Hovered::STORAGE)
gen_matching_window(inspect_label, Rect(inspect_p1, inspect_p2));
});
});
@ -571,6 +611,8 @@ void Sculpt::Main::_handle_hover()
_hovered_dialog = Hovered::NONE;
if (top_level_frame == "network") _hovered_dialog = Hovered::NETWORK;
if (top_level_frame == "storage") _hovered_dialog = Hovered::STORAGE;
if (top_level_frame == "runtime") _hovered_dialog = Hovered::RUNTIME;
if (top_level_frame == "logo") _hovered_dialog = Hovered::LOGO;
if (orig_hovered_dialog != _hovered_dialog)
_apply_to_hovered_dialog(orig_hovered_dialog, [&] (Dialog &dialog) {
@ -818,6 +860,9 @@ void Sculpt::Main::_generate_runtime_config(Xml_generator &xml) const
gen_parent_service<Irq_session>(xml);
});
xml.node("start", [&] () {
gen_runtime_view_start_content(xml, _gui.font_size()); });
_storage.gen_runtime_start_nodes(xml);
/*

View File

@ -230,11 +230,6 @@ void Sculpt::Storage_device::gen_part_blk_start_content(Xml_generator &xml,
gen_provides<Block::Session>(xml);
xml.node("route", [&] () {
gen_parent_rom_route(xml, "part_blk");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_route<Cpu_session> (xml);
gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session> (xml);
gen_service_node<Block::Session>(xml, [&] () {
if (server_name.valid())
@ -243,6 +238,12 @@ void Sculpt::Storage_device::gen_part_blk_start_content(Xml_generator &xml,
xml.node("parent", [&] () {
xml.attribute("label", label); }); });
gen_parent_rom_route(xml, "part_blk");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_route<Cpu_session> (xml);
gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session> (xml);
gen_service_node<Report::Session>(xml, [&] () {
xml.attribute("label", "partitions");
xml.node("parent", [&] () { }); });

View File

@ -44,10 +44,10 @@ struct Sculpt::Storage_target
return partition.valid() ? Label(device, ".", partition) : Label(device);
}
Label fs() const { return Label(label(), ".fs"); }
bool ram_fs() const { return device == "ram_fs"; }
Label fs() const { return ram_fs() ? label() : Label(label(), ".fs"); }
void gen_block_session_route(Xml_generator &xml) const
{
bool const ahci = (Label(Cstring(device.string(), 4)) == "ahci");

View File

@ -224,5 +224,5 @@ void Sculpt::Network::gen_runtime_start_nodes(Xml_generator &xml) const
if (_nic_target.type() != Nic_target::OFF)
xml.node("start", [&] () {
gen_nic_router_start_content(xml); });
gen_nic_router_start_content(xml, _nic_target); });
}

View File

@ -26,5 +26,6 @@
#include <runtime/nic_router.cc>
#include <runtime/prepare.cc>
#include <runtime/ram_fs.cc>
#include <runtime/runtime_view.cc>
#include <runtime/update.cc>
#include <runtime/wifi_drv.cc>

View File

@ -41,10 +41,14 @@ namespace Sculpt {
void gen_depot_query_start_content(Xml_generator &);
void gen_launcher_query_start_content(Xml_generator &);
void gen_runtime_view_start_content(Xml_generator &, float font_size);
struct File_browser_version { unsigned value; };
void gen_file_browser(Xml_generator &, Storage_devices const &,
Ram_fs_state const &, File_browser_version);
void gen_runtime_view(Xml_generator &);
void gen_fs_start_content(Xml_generator &, Storage_target const &,
File_system::Type);
@ -58,7 +62,7 @@ namespace Sculpt {
void gen_nic_drv_start_content(Xml_generator &);
void gen_wifi_drv_start_content(Xml_generator &);
void gen_nic_router_start_content(Xml_generator &);
void gen_nic_router_start_content(Xml_generator &, Nic_target const &);
void gen_nic_router_uplink(Xml_generator &, char const *);
struct Prepare_version { unsigned value; };

View File

@ -27,6 +27,9 @@ void Sculpt::gen_depot_query_start_content(Xml_generator &xml)
xml.node("fs", [&] () {}); }); }); });
xml.node("route", [&] () {
gen_service_node<::File_system::Session>(xml, [&] () {
gen_named_node(xml, "child", "depot"); });
gen_parent_rom_route(xml, "depot_query");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
@ -36,8 +39,5 @@ void Sculpt::gen_depot_query_start_content(Xml_generator &xml)
gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session> (xml);
gen_parent_route<Report::Session> (xml);
gen_service_node<::File_system::Session>(xml, [&] () {
gen_named_node(xml, "child", "depot"); });
});
}

View File

@ -53,6 +53,7 @@ void Sculpt::gen_e2fs_start_content(Xml_generator &xml,
});
xml.node("route", [&] () {
target.gen_block_session_route(xml);
gen_parent_rom_route(xml, "noux");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_route<Cpu_session> (xml);
@ -60,8 +61,6 @@ void Sculpt::gen_e2fs_start_content(Xml_generator &xml,
gen_parent_route<Log_session> (xml);
gen_parent_route<Rom_session> (xml);
gen_parent_route<Timer::Session> (xml);
target.gen_block_session_route(xml);
});
}

View File

@ -72,6 +72,12 @@ void Sculpt::gen_terminal_start(Xml_generator &xml, Rom_name const &name,
gen_provides<Terminal::Session>(xml);
xml.node("route", [&] () {
gen_service_node<Framebuffer::Session>(xml, [&] () {
gen_named_node(xml, "child", nit_fb_name); });
gen_service_node<Input::Session>(xml, [&] () {
gen_named_node(xml, "child", nit_fb_name); });
gen_parent_rom_route(xml, "terminal");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
@ -89,12 +95,6 @@ void Sculpt::gen_terminal_start(Xml_generator &xml, Rom_name const &name,
xml.attribute("label", "config");
xml.node("parent", [&] () {
xml.attribute("label", "config -> managed/fonts"); }); });
gen_service_node<Framebuffer::Session>(xml, [&] () {
gen_named_node(xml, "child", nit_fb_name); });
gen_service_node<Input::Session>(xml, [&] () {
gen_named_node(xml, "child", nit_fb_name); });
});
}
@ -158,6 +158,10 @@ void Sculpt::gen_noux_start(Xml_generator &xml, Rom_name const &name,
});
xml.node("route", [&] () {
gen_service_node<Terminal::Session>(xml, [&] () {
gen_named_node(xml, "child", terminal_name); });
gen_parent_rom_route(xml, "noux");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
@ -177,9 +181,6 @@ void Sculpt::gen_noux_start(Xml_generator &xml, Rom_name const &name,
gen_parent_route<Log_session> (xml);
gen_parent_route<Timer::Session> (xml);
gen_service_node<Terminal::Session>(xml, [&] () {
gen_named_node(xml, "child", terminal_name); });
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", "config");
xml.node("parent", [&] () { xml.attribute("label", "config"); });
@ -212,13 +213,13 @@ void Sculpt::gen_file_browser(Xml_generator &xml,
File_browser_version version)
{
xml.node("start", [&] () {
gen_nit_fb_start(xml, "storage browser"); });
gen_nit_fb_start(xml, "inspect"); });
xml.node("start", [&] () {
gen_terminal_start(xml, "storage browser terminal", "storage browser",
gen_terminal_start(xml, "inspect terminal", "inspect",
version); });
xml.node("start", [&] () {
gen_noux_start(xml, "storage browser noux", "storage browser terminal",
gen_noux_start(xml, "inspect noux", "inspect terminal",
devices, ram_fs_state, version); });
}

View File

@ -43,6 +43,7 @@ void Sculpt::gen_fs_start_content(Xml_generator &xml,
});
xml.node("route", [&] () {
target.gen_block_session_route(xml);
gen_parent_rom_route(xml, "vfs");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
@ -54,7 +55,5 @@ void Sculpt::gen_fs_start_content(Xml_generator &xml,
gen_parent_route<Rm_session> (xml);
gen_parent_route<Log_session> (xml);
gen_parent_route<Timer::Session> (xml);
target.gen_block_session_route(xml);
});
}

View File

@ -40,15 +40,16 @@ void Sculpt::_gen_gpt_write_start_content(Xml_generator &xml,
});
xml.node("route", [&] () {
Storage_target const target { device.label, Partition::Number { } };
target.gen_block_session_route(xml);
gen_parent_rom_route(xml, "gpt_write");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_route<Cpu_session> (xml);
gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session> (xml);
gen_parent_route<Rom_session> (xml);
Storage_target const target { device.label, Partition::Number { } };
target.gen_block_session_route(xml);
});
}

View File

@ -14,7 +14,8 @@
#include <runtime.h>
void Sculpt::gen_nic_router_start_content(Xml_generator &xml)
void Sculpt::gen_nic_router_start_content(Xml_generator &xml,
Nic_target const &nic_target)
{
gen_common_start_content(xml, "nic_router",
Cap_quota{300}, Ram_quota{10*1024*1024});
@ -22,6 +23,26 @@ void Sculpt::gen_nic_router_start_content(Xml_generator &xml)
gen_provides<Nic::Session>(xml);
xml.node("route", [&] () {
auto gen_nic_route = [&] (char const *label, char const *server) {
gen_service_node<Nic::Session>(xml, [&] () {
xml.attribute("label", label);
gen_named_node(xml, "child", server); }); };
/*
* Define primary dependency first (for the graph layout), according to
* the selected NIC target. We still keep routes to both NIC driver to
* accommodate the NIC router in the intermediate phase when switching
* the NIC target.
*/
if (nic_target.wifi()) {
gen_nic_route("wifi", "wifi_drv");
gen_nic_route("wired", "nic_drv");
} else {
gen_nic_route("wired", "nic_drv");
gen_nic_route("wifi", "wifi_drv");
}
gen_parent_rom_route(xml, "nic_router");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "config", "config -> managed/nic_router");
@ -31,13 +52,5 @@ void Sculpt::gen_nic_router_start_content(Xml_generator &xml)
gen_parent_route<Log_session> (xml);
gen_parent_route<Timer::Session> (xml);
gen_parent_route<Report::Session> (xml);
gen_service_node<Nic::Session>(xml, [&] () {
xml.attribute("label", "wired");
gen_named_node(xml, "child", "nic_drv");
});
gen_service_node<Nic::Session>(xml, [&] () {
xml.attribute("label", "wifi");
gen_named_node(xml, "child", "wifi_drv");
});
});
}

View File

@ -70,6 +70,11 @@ void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version versi
});
xml.node("route", [&] () {
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", "target");
gen_named_node(xml, "child", "default_fs_rw"); });
gen_parent_rom_route(xml, "noux");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "bash-minimal.tar");
@ -86,10 +91,6 @@ void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version versi
gen_parent_route<Rom_session> (xml);
gen_parent_route<Timer::Session> (xml);
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", "target");
gen_named_node(xml, "child", "default_fs_rw"); });
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", "config");
xml.node("parent", [&] () { xml.attribute("label", "config"); }); });

View File

@ -0,0 +1,76 @@
/*
* \brief Menu view instance used for displaying the runtime view
* \author Norman Feske
* \date 2018-08-22
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/log.h>
/* local includes */
#include <runtime.h>
void Sculpt::gen_runtime_view_start_content(Xml_generator &xml, float font_size)
{
gen_common_start_content(xml, "runtime_view", Cap_quota{200}, Ram_quota{9*1024*1024});
gen_named_node(xml, "binary", "menu_view");
xml.node("config", [&] () {
xml.node("libc", [&] () { xml.attribute("stderr", "/dev/log"); });
xml.node("report", [&] () { xml.attribute("hover", "yes"); });
xml.node("vfs", [&] () {
gen_named_node(xml, "tar", "menu_view_styles.tar");
gen_named_node(xml, "rom", "Vera.ttf");
gen_named_node(xml, "dir", "fonts", [&] () {
gen_named_node(xml, "dir", "text", [&] () {
gen_named_node(xml, "ttf", "regular", [&] () {
xml.attribute("size_px", font_size);
xml.attribute("cache", "256K");
xml.attribute("path", "/Vera.ttf"); }); }); });
gen_named_node(xml, "dir", "dev", [&] () {
xml.node("log", [&] () { }); });
});
});
xml.node("route", [&] () {
gen_service_node<Nitpicker::Session>(xml, [&] () {
xml.node("parent", [&] () {
xml.attribute("label", "leitzentrale -> runtime_view"); }); });
gen_service_node<Rom_session>(xml, [&] () {
xml.attribute("label", "dialog");
xml.node("parent", [&] () { }); });
gen_service_node<Report::Session>(xml, [&] () {
xml.attribute("label", "hover");
xml.node("parent", [&] () { }); });
gen_parent_rom_route(xml, "menu_view");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
gen_parent_rom_route(xml, "vfs_ttf.lib.so");
gen_parent_rom_route(xml, "libc.lib.so");
gen_parent_rom_route(xml, "libm.lib.so");
gen_parent_rom_route(xml, "libpng.lib.so");
gen_parent_rom_route(xml, "zlib.lib.so");
gen_parent_rom_route(xml, "menu_view_styles.tar");
gen_parent_rom_route(xml, "Vera.ttf");
gen_parent_rom_route(xml, "dialog");
gen_parent_route<Cpu_session> (xml);
gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session> (xml);
gen_parent_route<Timer::Session> (xml);
});
}

View File

@ -21,6 +21,16 @@ void Sculpt::gen_update_start_content(Xml_generator &xml)
xml.node("route", [&] () {
typedef String<32> Label;
auto gen_fs = [&] (Label const &label, Label const &server) {
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", label);
gen_named_node(xml, "child", server); }); };
/* connect file-system sessions to chroot instances */
gen_fs("depot", "depot_rw");
gen_fs("public", "public_rw");
gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_rom_route(xml, "vfs.lib.so");
gen_parent_rom_route(xml, "libc.lib.so");
@ -53,16 +63,6 @@ void Sculpt::gen_update_start_content(Xml_generator &xml)
gen_parent_route<Timer::Session> (xml);
gen_parent_route<Report::Session>(xml);
typedef String<32> Label;
auto gen_fs = [&] (Label const &label, Label const &server) {
gen_service_node<::File_system::Session>(xml, [&] () {
xml.attribute("label", label);
gen_named_node(xml, "child", server); }); };
/* connect file-system sessions to chroot instances */
gen_fs("depot", "depot_rw");
gen_fs("public", "public_rw");
auto gen_relabeled_log = [&] (Label const &label, Label const &relabeled) {
gen_service_node<Log_session>(xml, [&] () {
xml.attribute("label", label);

View File

@ -406,7 +406,7 @@ void Sculpt::Storage_dialog::_gen_ram_fs(Xml_generator &xml) const
}
void Sculpt::Storage_dialog::generate(Xml_generator &xml) const
void Sculpt::Storage_dialog::generate(Xml_generator &xml, bool expanded) const
{
gen_named_node(xml, "frame", "storage", [&] () {
xml.node("vbox", [&] () {
@ -414,6 +414,10 @@ void Sculpt::Storage_dialog::generate(Xml_generator &xml) const
xml.attribute("text", "Storage");
xml.attribute("font", "title/regular");
});
if (!expanded)
return;
_storage_devices.block_devices.for_each([&] (Block_device const &dev) {
_gen_block_device(xml, dev); });
_storage_devices.usb_storage_devices.for_each([&] (Usb_storage_device const &dev) {

View File

@ -43,7 +43,7 @@ struct Sculpt::Storage_dialog : Dialog
Selectable_item _operation_item { };
Activatable_item _confirm_item { };
void generate(Xml_generator &) const;
void generate(Xml_generator &, bool expanded) const;
void _gen_block_device(Xml_generator &, Block_device const &) const;