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;