mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-08 20:05:54 +00:00
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:
parent
40a84e0c81
commit
cdef4c2548
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
155
repos/gems/src/app/sculpt_manager/graph.h
Normal file
155
repos/gems/src/app/sculpt_manager/graph.h
Normal 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_ */
|
@ -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)); });
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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", [&] () { }); });
|
||||
|
@ -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");
|
||||
|
@ -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); });
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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; };
|
||||
|
@ -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"); });
|
||||
});
|
||||
}
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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); });
|
||||
}
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -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"); }); });
|
||||
|
76
repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc
Normal file
76
repos/gems/src/app/sculpt_manager/runtime/runtime_view.cc
Normal 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);
|
||||
});
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user