From cdef4c254860c571d043dc3da13ed5cd7aadd9f7 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 5 Jul 2018 16:57:43 +0200 Subject: [PATCH] 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. --- repos/gems/run/leitzentrale.run | 9 +- repos/gems/run/sculpt.run | 6 + repos/gems/run/sculpt/leitzentrale.config | 21 +-- repos/gems/src/app/sculpt_manager/graph.h | 155 ++++++++++++++++++ repos/gems/src/app/sculpt_manager/gui.cc | 2 +- repos/gems/src/app/sculpt_manager/gui.h | 5 + repos/gems/src/app/sculpt_manager/main.cc | 59 ++++++- .../app/sculpt_manager/model/storage_device.h | 11 +- .../app/sculpt_manager/model/storage_target.h | 4 +- repos/gems/src/app/sculpt_manager/network.cc | 2 +- repos/gems/src/app/sculpt_manager/runtime.cc | 1 + repos/gems/src/app/sculpt_manager/runtime.h | 6 +- .../app/sculpt_manager/runtime/depot_query.cc | 6 +- .../src/app/sculpt_manager/runtime/e2fs.cc | 3 +- .../sculpt_manager/runtime/file_browser.cc | 25 +-- .../app/sculpt_manager/runtime/file_system.cc | 3 +- .../app/sculpt_manager/runtime/gpt_write.cc | 7 +- .../app/sculpt_manager/runtime/nic_router.cc | 31 +++- .../src/app/sculpt_manager/runtime/prepare.cc | 9 +- .../sculpt_manager/runtime/runtime_view.cc | 76 +++++++++ .../src/app/sculpt_manager/runtime/update.cc | 20 +-- .../app/sculpt_manager/view/storage_dialog.cc | 6 +- .../app/sculpt_manager/view/storage_dialog.h | 2 +- 23 files changed, 394 insertions(+), 75 deletions(-) create mode 100644 repos/gems/src/app/sculpt_manager/graph.h create mode 100644 repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc diff --git a/repos/gems/run/leitzentrale.run b/repos/gems/run/leitzentrale.run index 8a16cfb7c6..7d0278879f 100644 --- a/repos/gems/run/leitzentrale.run +++ b/repos/gems/run/leitzentrale.run @@ -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"/> + @@ -146,6 +149,7 @@ install_config { + See the core log for messages. @@ -230,6 +234,8 @@ install_config { + + @@ -259,6 +265,8 @@ install_config { + + @@ -266,7 +274,6 @@ install_config { - diff --git a/repos/gems/run/sculpt.run b/repos/gems/run/sculpt.run index e3e4fb6d31..9ab37f0627 100644 --- a/repos/gems/run/sculpt.run +++ b/repos/gems/run/sculpt.run @@ -70,6 +70,8 @@ install_config { report="global_keys_handler -> slides"/> + @@ -381,6 +383,8 @@ install_config { + + @@ -411,6 +415,8 @@ install_config { + + diff --git a/repos/gems/run/sculpt/leitzentrale.config b/repos/gems/run/sculpt/leitzentrale.config index 9940941051..ff8aae2020 100644 --- a/repos/gems/run/sculpt/leitzentrale.config +++ b/repos/gems/run/sculpt/leitzentrale.config @@ -90,16 +90,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -180,6 +180,7 @@ + diff --git a/repos/gems/src/app/sculpt_manager/graph.h b/repos/gems/src/app/sculpt_manager/graph.h new file mode 100644 index 0000000000..028039b2c3 --- /dev/null +++ b/repos/gems/src/app/sculpt_manager/graph.h @@ -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 + +/* local includes */ +#include +#include + +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 _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 + 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_ */ diff --git a/repos/gems/src/app/sculpt_manager/gui.cc b/repos/gems/src/app/sculpt_manager/gui.cc index 7252215be3..7ac52950ec 100644 --- a/repos/gems/src/app/sculpt_manager/gui.cc +++ b/repos/gems/src/app/sculpt_manager/gui.cc @@ -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)); }); } diff --git a/repos/gems/src/app/sculpt_manager/gui.h b/repos/gems/src/app/sculpt_manager/gui.h index 6d531bf47f..72ae2417bd 100644 --- a/repos/gems/src/app/sculpt_manager/gui.h +++ b/repos/gems/src/app/sculpt_manager/gui.h @@ -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); } diff --git a/repos/gems/src/app/sculpt_manager/main.cc b/repos/gems/src/app/sculpt_manager/main.cc index ceae0f711a..9679bd4a29 100644 --- a/repos/gems/src/app/sculpt_manager/main.cc +++ b/repos/gems/src/app/sculpt_manager/main.cc @@ -31,6 +31,7 @@ #include #include #include +#include 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
_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(xml); }); + xml.node("start", [&] () { + gen_runtime_view_start_content(xml, _gui.font_size()); }); + _storage.gen_runtime_start_nodes(xml); /* diff --git a/repos/gems/src/app/sculpt_manager/model/storage_device.h b/repos/gems/src/app/sculpt_manager/model/storage_device.h index 0001aab84a..34868fe1a6 100644 --- a/repos/gems/src/app/sculpt_manager/model/storage_device.h +++ b/repos/gems/src/app/sculpt_manager/model/storage_device.h @@ -230,11 +230,6 @@ void Sculpt::Storage_device::gen_part_blk_start_content(Xml_generator &xml, gen_provides(xml); xml.node("route", [&] () { - gen_parent_rom_route(xml, "part_blk"); - gen_parent_rom_route(xml, "ld.lib.so"); - gen_parent_route (xml); - gen_parent_route (xml); - gen_parent_route (xml); gen_service_node(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 (xml); + gen_parent_route (xml); + gen_parent_route (xml); + gen_service_node(xml, [&] () { xml.attribute("label", "partitions"); xml.node("parent", [&] () { }); }); diff --git a/repos/gems/src/app/sculpt_manager/model/storage_target.h b/repos/gems/src/app/sculpt_manager/model/storage_target.h index 4aca570af3..36bb207242 100644 --- a/repos/gems/src/app/sculpt_manager/model/storage_target.h +++ b/repos/gems/src/app/sculpt_manager/model/storage_target.h @@ -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"); diff --git a/repos/gems/src/app/sculpt_manager/network.cc b/repos/gems/src/app/sculpt_manager/network.cc index e9bf1e1586..d6b3d6692c 100644 --- a/repos/gems/src/app/sculpt_manager/network.cc +++ b/repos/gems/src/app/sculpt_manager/network.cc @@ -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); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime.cc b/repos/gems/src/app/sculpt_manager/runtime.cc index af0fcab8c2..b1a5675626 100644 --- a/repos/gems/src/app/sculpt_manager/runtime.cc +++ b/repos/gems/src/app/sculpt_manager/runtime.cc @@ -26,5 +26,6 @@ #include #include #include +#include #include #include diff --git a/repos/gems/src/app/sculpt_manager/runtime.h b/repos/gems/src/app/sculpt_manager/runtime.h index d4fa174847..eb1c40246c 100644 --- a/repos/gems/src/app/sculpt_manager/runtime.h +++ b/repos/gems/src/app/sculpt_manager/runtime.h @@ -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; }; diff --git a/repos/gems/src/app/sculpt_manager/runtime/depot_query.cc b/repos/gems/src/app/sculpt_manager/runtime/depot_query.cc index a25f860c9c..92f00188b4 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/depot_query.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/depot_query.cc @@ -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 (xml); gen_parent_route (xml); gen_parent_route (xml); - - gen_service_node<::File_system::Session>(xml, [&] () { - gen_named_node(xml, "child", "depot"); }); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/e2fs.cc b/repos/gems/src/app/sculpt_manager/runtime/e2fs.cc index ae93336f82..8fe86c0f1c 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/e2fs.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/e2fs.cc @@ -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 (xml); @@ -60,8 +61,6 @@ void Sculpt::gen_e2fs_start_content(Xml_generator &xml, gen_parent_route (xml); gen_parent_route (xml); gen_parent_route (xml); - - target.gen_block_session_route(xml); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/file_browser.cc b/repos/gems/src/app/sculpt_manager/runtime/file_browser.cc index 4808e3ac4b..f8cab57fc2 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/file_browser.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/file_browser.cc @@ -72,6 +72,12 @@ void Sculpt::gen_terminal_start(Xml_generator &xml, Rom_name const &name, gen_provides(xml); xml.node("route", [&] () { + gen_service_node(xml, [&] () { + gen_named_node(xml, "child", nit_fb_name); }); + + gen_service_node(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(xml, [&] () { - gen_named_node(xml, "child", nit_fb_name); }); - - gen_service_node(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(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 (xml); gen_parent_route (xml); - gen_service_node(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); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/file_system.cc b/repos/gems/src/app/sculpt_manager/runtime/file_system.cc index 499afd00e5..40939fd6ec 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/file_system.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/file_system.cc @@ -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 (xml); gen_parent_route (xml); gen_parent_route (xml); - - target.gen_block_session_route(xml); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/gpt_write.cc b/repos/gems/src/app/sculpt_manager/runtime/gpt_write.cc index f126e4ac27..c7893dee28 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/gpt_write.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/gpt_write.cc @@ -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 (xml); gen_parent_route (xml); gen_parent_route (xml); gen_parent_route (xml); - - Storage_target const target { device.label, Partition::Number { } }; - target.gen_block_session_route(xml); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/nic_router.cc b/repos/gems/src/app/sculpt_manager/runtime/nic_router.cc index 81378a6391..3b44921b31 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/nic_router.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/nic_router.cc @@ -14,7 +14,8 @@ #include -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(xml); xml.node("route", [&] () { + + auto gen_nic_route = [&] (char const *label, char const *server) { + gen_service_node(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 (xml); gen_parent_route (xml); gen_parent_route (xml); - gen_service_node(xml, [&] () { - xml.attribute("label", "wired"); - gen_named_node(xml, "child", "nic_drv"); - }); - gen_service_node(xml, [&] () { - xml.attribute("label", "wifi"); - gen_named_node(xml, "child", "wifi_drv"); - }); }); } diff --git a/repos/gems/src/app/sculpt_manager/runtime/prepare.cc b/repos/gems/src/app/sculpt_manager/runtime/prepare.cc index f5186d9e02..9421932e0b 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/prepare.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/prepare.cc @@ -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 (xml); gen_parent_route (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"); }); }); diff --git a/repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc b/repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc new file mode 100644 index 0000000000..db6492f463 --- /dev/null +++ b/repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc @@ -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 + +/* local includes */ +#include + + +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(xml, [&] () { + xml.node("parent", [&] () { + xml.attribute("label", "leitzentrale -> runtime_view"); }); }); + + gen_service_node(xml, [&] () { + xml.attribute("label", "dialog"); + xml.node("parent", [&] () { }); }); + + gen_service_node(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 (xml); + gen_parent_route (xml); + gen_parent_route (xml); + gen_parent_route (xml); + }); +} + diff --git a/repos/gems/src/app/sculpt_manager/runtime/update.cc b/repos/gems/src/app/sculpt_manager/runtime/update.cc index c52a183b24..abcdb59668 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/update.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/update.cc @@ -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 (xml); gen_parent_route(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(xml, [&] () { xml.attribute("label", label); diff --git a/repos/gems/src/app/sculpt_manager/view/storage_dialog.cc b/repos/gems/src/app/sculpt_manager/view/storage_dialog.cc index f181a4bd52..bb8617392f 100644 --- a/repos/gems/src/app/sculpt_manager/view/storage_dialog.cc +++ b/repos/gems/src/app/sculpt_manager/view/storage_dialog.cc @@ -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) { diff --git a/repos/gems/src/app/sculpt_manager/view/storage_dialog.h b/repos/gems/src/app/sculpt_manager/view/storage_dialog.h index 382f27685e..7731a2364f 100644 --- a/repos/gems/src/app/sculpt_manager/view/storage_dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/storage_dialog.h @@ -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;