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;