diff --git a/repos/gems/run/launcher.run b/repos/gems/run/launcher.run
deleted file mode 100644
index e672faa8ad..0000000000
--- a/repos/gems/run/launcher.run
+++ /dev/null
@@ -1,306 +0,0 @@
-create_boot_directory
-
-import_from_depot [depot_user]/src/[base_src] \
- [depot_user]/pkg/[drivers_interactive_pkg] \
- [depot_user]/pkg/motif_wm \
- [depot_user]/raw/genode_bg \
- [depot_user]/pkg/fonts_fs \
- [depot_user]/pkg/backdrop \
- [depot_user]/src/demo \
- [depot_user]/src/init \
- [depot_user]/src/nitpicker \
- [depot_user]/src/nit_fb \
- [depot_user]/src/nit_fader \
- [depot_user]/src/rom_filter \
- [depot_user]/src/menu_view
-
-install_config {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-build { app/launcher test/nitpicker app/status_bar app/global_keys_handler }
-
-build_boot_image { testnit launcher global_keys_handler status_bar }
-
-run_genode_until forever
diff --git a/repos/gems/src/app/launcher/context_dialog.h b/repos/gems/src/app/launcher/context_dialog.h
deleted file mode 100644
index 859d517640..0000000000
--- a/repos/gems/src/app/launcher/context_dialog.h
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * \brief Context dialog
- * \author Norman Feske
- * \date 2014-10-04
- */
-
-/*
- * Copyright (C) 2014-2017 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 _CONTEXT_DIALOG_H_
-#define _CONTEXT_DIALOG_H_
-
-/* local includes */
-#include
-
-namespace Launcher { struct Context_dialog; }
-
-
-class Launcher::Context_dialog : Input_event_handler, Dialog_generator,
- Hover_handler, Dialog_model
-{
- public:
-
- struct Response_handler
- {
- virtual void handle_context_kill() = 0;
- virtual void handle_context_hide() = 0;
- };
-
- private:
-
- struct Element : List::Element
- {
- Label label;
-
- bool hovered = false;
- bool touched = false;
- bool selected = false;
-
- Element(char const *label) : label(label) { }
- };
-
- Label _hovered() const
- {
- for (Element const *e = _elements.first(); e; e = e->next())
- if (e->hovered)
- return e->label;
-
- return Label("");
- }
-
- List _elements;
-
- void _generate_dialog_elements(Xml_generator &xml)
- {
- for (Element const *e = _elements.first(); e; e = e->next()) {
-
- xml.node("button", [&] () {
- xml.attribute("name", e->label.string());
-
- if ((e->hovered && !_click_in_progress)
- || (e->hovered && e->touched))
- xml.attribute("hovered", "yes");
-
- if (e->selected || e->touched)
- xml.attribute("selected", "yes");
-
- xml.node("label", [&] () {
- xml.attribute("text", e->label.string());
- });
- });
- }
- }
-
- void _touch(Label const &label)
- {
- for (Element *e = _elements.first(); e; e = e->next())
- e->touched = (e->label == label);
- }
-
- void _reset_hover()
- {
- for (Element *e = _elements.first(); e; e = e->next())
- e->hovered = false;
- }
-
- Element _hide_button { "Hide" };
- Element _kill_button { "Kill" };
-
- Fading_dialog _dialog;
-
- bool _open = false;
-
- unsigned _key_cnt = 0;
- Label _clicked;
- bool _click_in_progress = false;
-
- Label _subsystem;
-
- Response_handler &_response_handler;
-
- public:
-
- Context_dialog(Env &env,
- Report_rom_slave &report_rom_slave,
- Response_handler &response_handler)
- :
- _dialog(env, report_rom_slave,
- "context_dialog", "context_hover",
- *this, *this, *this, *this,
- Fading_dialog::Position(364, 64)),
- _response_handler(response_handler)
- {
- _elements.insert(&_hide_button);
- _elements.insert(&_kill_button);
-
- _dialog.update();
- }
-
- /**
- * Dialog_generator interface
- */
- void generate_dialog(Xml_generator &xml) override
- {
- xml.node("frame", [&] () {
- xml.node("vbox", [&] () {
- _generate_dialog_elements(xml);
- });
- });
- }
-
- /**
- * Hover_handler interface
- */
- void hover_changed(Xml_node hover) override
- {
- Label const old_hovered = _hovered();
-
- _reset_hover();
-
- try {
- Xml_node button = hover.sub_node("dialog")
- .sub_node("frame")
- .sub_node("vbox")
- .sub_node("button");
-
- for (Element *e = _elements.first(); e; e = e->next()) {
-
- Label const label = button.attribute_value("name", Label(""));
-
- if (e->label == label)
- e->hovered = true;
- }
- } catch (Xml_node::Nonexistent_sub_node) { }
-
- Label const new_hovered = _hovered();
-
- if (old_hovered != new_hovered)
- dialog_changed();
- }
-
- /**
- * Input_event_handler interface
- */
- bool handle_input_event(Input::Event const &ev) override
- {
- if (ev.absolute_motion()) {
-
- /*
- * Re-enable the visibility of the menu if we detect motion
- * events over the menu. This way, it reappears in situations
- * where the pointer temporarily leaves the view and returns.
- */
- if (_open)
- visible(true);
-
- return true;
- }
-
- if (ev.hover_leave()) {
- visible(false);
- return true;
- }
-
- if (ev.press()) _key_cnt++;
- if (ev.release()) _key_cnt--;
-
- if (ev.key_press(Input::BTN_LEFT) && _key_cnt == 1) {
-
- Label const hovered = _hovered();
-
- _click_in_progress = true;
- _clicked = hovered;
- _touch(hovered);
- dialog_changed();
- }
-
- if (ev.release() && _click_in_progress && _key_cnt == 0) {
-
- Label const hovered = _hovered();
-
- if (_clicked == hovered) {
-
- if (_kill_button.hovered)
- _response_handler.handle_context_kill();
-
- if (_hide_button.hovered)
- _response_handler.handle_context_hide();
- } else {
- _touch("");
- }
-
- _clicked = Label("");
- _click_in_progress = false;
- dialog_changed();
- }
-
- return false;
- }
-
- void visible(bool visible)
- {
- if (visible == _dialog.visible())
- return;
-
- /* reset touch state when (re-)opening the context dialog */
- if (visible) {
- _open = true;
- _touch("");
- _reset_hover();
- dialog_changed();
- _dialog.update();
- }
-
- _dialog.visible(visible);
- }
-
- void close()
- {
- _open = false;
- visible(false);
- }
-
- void position(Fading_dialog::Position position)
- {
- _dialog.position(position);
- }
-};
-
-#endif /* _CONTEXT_DIALOG_H_ */
diff --git a/repos/gems/src/app/launcher/dialog_nitpicker.h b/repos/gems/src/app/launcher/dialog_nitpicker.h
deleted file mode 100644
index b89d0b5c5a..0000000000
--- a/repos/gems/src/app/launcher/dialog_nitpicker.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * \brief Local nitpicker service provided to dialog slaves
- * \author Norman Feske
- * \date 2014-10-01
- *
- * This implementation of the nitpicker interface intercepts the input events
- * of a dialog slave to let the launcher respond to events (like mouse clicks)
- * directly.
- */
-
-/*
- * Copyright (C) 2014-2017 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 _DIALOG_NITPICKER_H_
-#define _DIALOG_NITPICKER_H_
-
-/* Genode includes */
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-/* gems includes */
-#include
-
-/* local includes */
-#include
-
-namespace Launcher {
-
- struct Dialog_nitpicker_session;
- struct Dialog_nitpicker_service;
-}
-
-
-struct Launcher::Dialog_nitpicker_session : Wrapped_nitpicker_session
-{
- struct Input_event_handler
- {
- /**
- * Handle input event
- *
- * \return true if the event should be propagated to the wrapped
- * nitpicker session
- */
- virtual bool handle_input_event(Input::Event const &ev) = 0;
- };
-
- Env &_env;
-
- Input_event_handler &_input_event_handler;
-
- Rpc_entrypoint &_session_ep;
-
- Nitpicker::Session &_nitpicker_session;
-
- Input::Session_client _nitpicker_input { _env.rm(), _nitpicker_session.input_session() };
-
- Attached_dataspace _nitpicker_input_ds { _env.rm(), _nitpicker_input.dataspace() };
-
- Signal_handler _input_handler;
-
- Input::Session_component _input_session { _env, _env.ram() };
-
- /**
- * Constructor
- *
- * \param input_sigh_ep entrypoint where the input signal handler is
- * installed ('env.ep')
- * \param service_ep entrypoint providing the nitpicker session
- * (slave-specific ep)
- */
- Dialog_nitpicker_session(Env &env, Nitpicker::Session &nitpicker_session,
- Entrypoint &input_sigh_ep,
- Rpc_entrypoint &session_ep,
- Input_event_handler &input_event_handler)
- :
- Wrapped_nitpicker_session(nitpicker_session),
- _env(env),
- _input_event_handler(input_event_handler),
- _session_ep(session_ep),
- _nitpicker_session(nitpicker_session),
- _input_handler(input_sigh_ep, *this, &Dialog_nitpicker_session::_handle_input)
- {
- _session_ep.manage(this);
- _session_ep.manage(&_input_session);
- _nitpicker_input.sigh(_input_handler);
-
- _input_session.event_queue().enabled(true);
- }
-
- ~Dialog_nitpicker_session()
- {
- _session_ep.dissolve(&_input_session);
- _session_ep.dissolve(this);
- }
-
- void _handle_input()
- {
- Input::Event const * const events =
- _nitpicker_input_ds.local_addr();
-
- while (_nitpicker_input.pending()) {
-
- size_t const num_events = _nitpicker_input.flush();
- for (size_t i = 0; i < num_events; i++) {
-
- Input::Event const &ev = events[i];
-
- if (_input_event_handler.handle_input_event(ev))
- _input_session.submit(ev);
- }
- }
- }
-
-
- /*********************************
- ** Nitpicker session interface **
- *********************************/
-
- Input::Session_capability input_session() override
- {
- return _input_session.cap();
- }
-};
-
-#endif /* _DIALOG_NITPICKER_H_ */
diff --git a/repos/gems/src/app/launcher/fading_dialog.h b/repos/gems/src/app/launcher/fading_dialog.h
deleted file mode 100644
index a2cad987df..0000000000
--- a/repos/gems/src/app/launcher/fading_dialog.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * \brief Dialog
- * \author Norman Feske
- * \date 2014-10-02
- */
-
-/*
- * Copyright (C) 2014-2017 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 _FADING_DIALOG_H_
-#define _FADING_DIALOG_H_
-
-/* gems includes */
-#include
-#include
-
-/* local includes */
-#include
-#include
-#include
-#include
-
-namespace Launcher
-{
- struct Dialog_generator { virtual void generate_dialog(Xml_generator &) = 0; };
-
- struct Hover_handler { virtual void hover_changed(Xml_node hover) = 0; };
-
- typedef Dialog_nitpicker_session::Input_event_handler Input_event_handler;
-
- class Fading_dialog;
-
- class Dialog_model
- {
- private:
-
- bool _up_to_date = true;
-
- friend class Fading_dialog;
-
- public:
-
- void dialog_changed() { _up_to_date = false; }
- };
-}
-
-
-
-class Launcher::Fading_dialog : private Input_event_handler
-{
- private:
-
- Region_map &_rm;
-
- Slave::Connection _dialog_rom;
-
- /* dialog reported locally */
- Slave::Connection _dialog_report;
-
- Slave::Connection _hover_rom;
-
- Constructible _hover_ds;
-
- /* hovered element reported by menu view */
- Slave::Connection _hover_report;
-
- Local_reporter _dialog_reporter;
-
- Input_event_handler &_dialog_input_event_handler;
-
- Hover_handler &_hover_handler;
-
- Dialog_generator &_dialog_generator;
-
- Dialog_model &_dialog_model;
-
- void _update_dialog()
- {
- bool const dialog_needs_update = !_dialog_model._up_to_date;
-
- _dialog_model._up_to_date = false;
-
- if (dialog_needs_update) {
- Local_reporter::Xml_generator xml(_dialog_reporter, [&] ()
- {
- _dialog_generator.generate_dialog(xml);
- });
- }
- }
-
- /**
- * Input_event_handler interface
- */
- bool handle_input_event(Input::Event const &ev) override
- {
- bool const forward_event = _dialog_input_event_handler.handle_input_event(ev);
- _update_dialog();
- return forward_event;
- }
-
- void _handle_hover_update()
- {
- try {
- if (!_hover_ds.constructed() || _hover_rom.update() == false) {
- if (_hover_ds.constructed())
- _hover_ds->invalidate();
- _hover_ds.construct(_rm, _hover_rom.dataspace());
- }
-
- Xml_node hover(_hover_ds->local_addr());
-
- _hover_handler.hover_changed(hover);
-
- bool const dialog_needs_update = !_dialog_model._up_to_date;
-
- _dialog_model._up_to_date = true;
-
- if (dialog_needs_update) {
- Local_reporter::Xml_generator xml(_dialog_reporter, [&] ()
- {
- _dialog_generator.generate_dialog(xml);
- });
- }
-
- } catch (...) {
- Genode::warning("no menu hover model available");
- }
- }
-
- Signal_handler _hover_update_handler;
-
- private:
-
- /*
- * Entrypoint for the fader slave
- *
- * This entrypoint is used for handling the parent interface for the
- * fader slave and for providing the wrapped nitpicker service to the
- * slave. The latter cannot be provided by the main entrypoint because
- * during the construction of the 'nit_fader_slave' (executed in the
- * context of the main entrypoint), the slave tries to create a
- * nitpicker session (to be answered with the wrapped session).
- */
- size_t const _fader_slave_ep_stack_size = 4*1024*sizeof(addr_t);
- Rpc_entrypoint _fader_slave_ep;
-
- /*
- * Provide wrapped nitpicker connection as a service handed out to
- * the menu-view slave
- */
- typedef Genode::Local_service Nitpicker_service;
- typedef Nitpicker_service::Single_session_factory Nitpicker_factory;
-
- Nitpicker::Connection _nitpicker_connection;
- Dialog_nitpicker_session _nitpicker_session;
- Nitpicker_factory _nitpicker_factory { _nitpicker_session };
- Nitpicker_service _nitpicker_service { _nitpicker_factory };
-
- Nit_fader_slave _nit_fader_slave;
- Slave::Connection _nit_fader_connection;
- Menu_view_slave _menu_view_slave;
-
- bool _visible = false;
-
- public:
-
- typedef Menu_view_slave::Position Position;
-
- Fading_dialog(Env &env,
- Report_rom_slave &report_rom_slave,
- char const *dialog_name,
- char const *hover_name,
- Input_event_handler &input_event_handler,
- Hover_handler &hover_handler,
- Dialog_generator &dialog_generator,
- Dialog_model &dialog_model,
- Position initial_position)
- :
- _rm(env.rm()),
- _dialog_rom(report_rom_slave.policy(), Slave::Args("label=", dialog_name)),
- _dialog_report(report_rom_slave.policy(),
- Slave::Args("label=", dialog_name, ", buffer_size=4096")),
- _hover_rom(report_rom_slave.policy(), Slave::Args("label=", hover_name)),
- _hover_report(report_rom_slave.policy(),
- Slave::Args("label=", hover_name, ", buffer_size=4096")),
- _dialog_reporter(env.rm(), "dialog", _dialog_report.rpc_cap()),
- _dialog_input_event_handler(input_event_handler),
- _hover_handler(hover_handler),
- _dialog_generator(dialog_generator),
- _dialog_model(dialog_model),
- _hover_update_handler(env.ep(), *this, &Fading_dialog::_handle_hover_update),
- _fader_slave_ep(&env.pd(), _fader_slave_ep_stack_size, "nit_fader"),
- _nitpicker_connection(env, "menu"),
- _nitpicker_session(env, _nitpicker_connection, env.ep(), _fader_slave_ep, *this),
- _nit_fader_slave(env, _fader_slave_ep, _nitpicker_service),
- _nit_fader_connection(env.rm(), _nit_fader_slave.policy(), Slave::Args("label=menu")),
- _menu_view_slave(env, _nit_fader_connection.rpc_cap(),
- _dialog_rom.rpc_cap(), _hover_report.rpc_cap(),
- initial_position)
- {
- Rom_session_client(_hover_rom).sigh(_hover_update_handler);
- }
-
- void update()
- {
- Local_reporter::Xml_generator xml(_dialog_reporter, [&] ()
- {
- _dialog_generator.generate_dialog(xml);
- });
- }
-
- void visible(bool visible)
- {
- _nit_fader_slave.visible(visible);
- _visible = visible;
- }
-
- bool visible() const { return _visible; }
-
- void position(Position position) { _menu_view_slave.position(position); }
-};
-
-#endif /* _FADING_DIALOG_H_ */
diff --git a/repos/gems/src/app/launcher/main.cc b/repos/gems/src/app/launcher/main.cc
deleted file mode 100644
index c5bc2b01d1..0000000000
--- a/repos/gems/src/app/launcher/main.cc
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * \brief Launcher
- * \author Norman Feske
- * \date 2014-09-30
- */
-
-/*
- * Copyright (C) 2014-2017 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
-#include
-#include
-#include
-#include
-
-/* local includes */
-#include
-
-namespace Launcher {
-
- using namespace Genode;
- struct Main;
-}
-
-
-struct Launcher::Main
-{
- Env &_env;
-
- char const *_report_rom_config =
- ""
- " "
- " "
- " "
- " "
- " "
- " "
- "";
-
- Report_rom_slave _report_rom_slave { _env, _report_rom_config };
-
- /**
- * Nitpicker session used to perform session-control operations on the
- * subsystem's nitpicker sessions and to receive global keyboard
- * shortcuts.
- */
- Nitpicker::Connection _nitpicker { _env };
-
- Signal_handler _input_handler =
- { _env.ep(), *this, &Main::_handle_input };
-
- void _handle_input();
-
- unsigned _key_cnt = 0;
-
- Signal_handler _exited_child_handler =
- { _env.ep(), *this, &Main::_handle_exited_child };
-
- Attached_rom_dataspace _config { _env, "config" };
-
- static size_t _ram_preservation(Xml_node config)
- {
- char const * const node_name = "preservation";
-
- if (config.has_sub_node(node_name)) {
-
- Xml_node const node = config.sub_node(node_name);
- if (node.attribute_value("name", Genode::String<16>()) == "RAM")
- return node.attribute_value("quantum", Genode::Number_of_bytes());
- }
-
- return 0;
- }
-
- Subsystem_manager _subsystem_manager { _env,
- _ram_preservation(_config.xml()),
- _exited_child_handler };
-
- Heap _heap { _env.ram(), _env.rm() };
-
- Panel_dialog _panel_dialog { _env, _heap, _report_rom_slave,
- _subsystem_manager, _nitpicker };
-
- void _handle_config();
-
- void _handle_exited_child()
- {
- auto kill_child_fn = [&] (Label const &label) { _panel_dialog.kill(label); };
-
- _subsystem_manager.for_each_exited_child(kill_child_fn);
- }
-
- Label _focus_prefix;
-
- Genode::Attached_rom_dataspace _focus_rom { _env, "focus" };
-
- void _handle_focus_update();
-
- Signal_handler _focus_update_handler =
- { _env.ep(), *this, &Main::_handle_focus_update };
-
- /**
- * Constructor
- */
- Main(Env &env) : _env(env)
- {
- _nitpicker.input()->sigh(_input_handler);
- _focus_rom.sigh(_focus_update_handler);
-
- _handle_config();
-
- _panel_dialog.visible(true);
- }
-};
-
-
-void Launcher::Main::_handle_config()
-{
- _config.update();
-
- _focus_prefix = _config.xml().attribute_value("focus_prefix", Label());
-
- try {
- _panel_dialog.update(_config.xml()); }
- catch (Allocator::Out_of_memory) {
- error("out of memory while applying configuration"); }
-}
-
-
-void Launcher::Main::_handle_input()
-{
- _nitpicker.input()->for_each_event([&] (Input::Event const &e) {
- if (e.press()) _key_cnt++;
- if (e.release()) _key_cnt--;
-
- /*
- * The _key_cnt can become 2 only when the global key (as configured
- * in the nitpicker config) is pressed together with another key.
- * Hence, the following condition triggers on key combinations with
- * the global modifier key, whatever the global modifier key is.
- */
- if (e.key_press(Input::KEY_TAB) && _key_cnt == 2)
- _panel_dialog.focus_next();
- });
-}
-
-
-void Launcher::Main::_handle_focus_update()
-{
- try {
- _focus_rom.update();
-
- Xml_node focus_node(_focus_rom.local_addr());
-
- /*
- * Propagate focus information to panel such that the focused
- * subsystem gets highlighted.
- */
- Label label = focus_node.attribute_value("label", Label());
-
- size_t const prefix_len = Genode::strlen(_focus_prefix.string());
- if (!Genode::strcmp(_focus_prefix.string(), label.string(), prefix_len)) {
- label = Label(label.string() + prefix_len);
-
- } else {
-
- /*
- * A foreign nitpicker client not started by ourself has the focus.
- */
- label = Label();
- }
-
- _panel_dialog.focus_changed(label);
-
- } catch (...) {
- Genode::warning("no focus model available");
- }
-}
-
-
-void Component::construct(Genode::Env &env) { static Launcher::Main main(env); }
diff --git a/repos/gems/src/app/launcher/menu_dialog.h b/repos/gems/src/app/launcher/menu_dialog.h
deleted file mode 100644
index 0a0290cac3..0000000000
--- a/repos/gems/src/app/launcher/menu_dialog.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * \brief Menu dialog
- * \author Norman Feske
- * \date 2014-10-04
- */
-
-/*
- * Copyright (C) 2014-2017 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 _MENU_DIALOG_H_
-#define _MENU_DIALOG_H_
-
-/* Genode includes */
-#include
-
-/* local includes */
-#include
-#include
-#include
-
-namespace Launcher { struct Menu_dialog; }
-
-
-class Launcher::Menu_dialog : Input_event_handler, Dialog_generator,
- Hover_handler, Dialog_model
-{
- public:
-
- struct Response_handler
- {
- virtual void handle_selection(Label const &) = 0;
- virtual void handle_menu_leave() = 0;
- virtual void handle_menu_motion() = 0;
- };
-
- private:
-
- Allocator &_alloc;
-
- Response_handler &_response_handler;
-
- typedef String<128> Title;
-
- struct Element : List::Element
- {
- Label label;
- Title title;
-
- bool hovered = false;
- bool touched = false;
- bool running = false;
-
- Element(Xml_node node)
- :
- label(node.attribute_value("name", Label(""))),
- title(node.attribute_value("title", Title(label.string())))
- { }
- };
-
- List _elements;
-
- void _generate_dialog_elements(Xml_generator &xml)
- {
- for (Element const *e = _elements.first(); e; e = e->next()) {
-
- xml.node("button", [&] () {
- xml.attribute("name", e->label.string());
-
- if ((e->hovered)
- || (e->hovered && e->touched))
- xml.attribute("hovered", "yes");
-
- if (e->running || e->touched)
- xml.attribute("selected", "yes");
-
- xml.node("label", [&] () {
- xml.attribute("text", e->title.string());
- });
- });
- }
- }
-
- Fading_dialog::Position _position { 0 - 4, 28 - 4 };
-
- Fading_dialog _dialog;
-
- Rect _hovered_rect;
-
- bool _open = false;
-
- unsigned _key_cnt = 0;
-
- Label _hovered() const
- {
- for (Element const *e = _elements.first(); e; e = e->next())
- if (e->hovered)
- return e->label;
-
- return Label("");
- }
-
- public:
-
- Menu_dialog(Env &env,
- Allocator &alloc,
- Report_rom_slave &report_rom_slave,
- Response_handler &response_handler)
- :
- _alloc(alloc), _response_handler(response_handler),
- _dialog(env, report_rom_slave, "menu_dialog", "menu_hover",
- *this, *this, *this, *this, _position)
- { }
-
- /**
- * Dialog_generator interface
- */
- void generate_dialog(Xml_generator &xml) override
- {
- xml.node("frame", [&] () {
- xml.node("vbox", [&] () {
- _generate_dialog_elements(xml);
- });
- });
- }
-
- Rect _hovered_button_rect(Xml_node hover) const
- {
- Point p(0, 0);
-
- for (;; hover = hover.sub_node()) {
-
- p = p + Point(point_attribute(hover));
-
- if (hover.has_type("button"))
- return Rect(p, area_attribute(hover));
-
- if (!hover.num_sub_nodes())
- break;
- }
-
- return Rect();
- }
-
- /**
- * Hover_handler interface
- */
- void hover_changed(Xml_node hover) override
- {
- Label const old_hovered = _hovered();
-
- for (Element *e = _elements.first(); e; e = e->next())
- e->hovered = false;
-
- try {
- Xml_node button = hover.sub_node("dialog")
- .sub_node("frame")
- .sub_node("vbox")
- .sub_node("button");
-
- for (Element *e = _elements.first(); e; e = e->next()) {
-
- Label const label = button.attribute_value("name", Label(""));
-
- if (e->label == label) {
- e->hovered = true;
-
- _hovered_rect = _hovered_button_rect(hover);
- }
- }
- } catch (Xml_node::Nonexistent_sub_node) { }
-
- Label const new_hovered = _hovered();
-
- if (old_hovered != new_hovered)
- dialog_changed();
- }
-
- /**
- * Input_event_handler interface
- */
- bool handle_input_event(Input::Event const &ev) override
- {
- if (ev.hover_leave()) {
- _response_handler.handle_menu_leave();
- return false;
- }
-
- if (ev.absolute_motion()) {
-
- _response_handler.handle_menu_motion();
-
- /*
- * Re-enable the visibility of the menu if we detect motion
- * events over the menu. This way, it reappears in situations
- * where the pointer temporarily leaves the view and returns.
- */
- if (_open)
- visible(true);
-
- return true;
- }
-
- if (ev.press()) _key_cnt++;
- if (ev.release()) _key_cnt--;
-
- if (ev.key_press(Input::BTN_LEFT) && _key_cnt == 1)
- _response_handler.handle_selection(_hovered());
-
- return false;
- }
-
- void visible(bool visible)
- {
- if (visible == _dialog.visible())
- return;
-
- _dialog.visible(visible);
-
- if (visible)
- _open = true;
- }
-
- void close()
- {
- _open = false;
- visible(false);
- }
-
- void running(Label const &label, bool running)
- {
- for (Element *e = _elements.first(); e; e = e->next())
- if (e->label == label)
- e->running = running;
-
- _dialog.update();
- }
-
- void update(Xml_node subsystems)
- {
- if (_elements.first()) {
- Genode::error("subsequent updates are not supported");
- return;
- }
-
- Element *last = nullptr;
-
- subsystems.for_each_sub_node("subsystem",
- [&] (Xml_node subsystem)
- {
- Element * const e = new (_alloc) Element(subsystem);
-
- _elements.insert(e, last);
- last = e;
- });
-
- _dialog.update();
- }
-};
-
-#endif /* _MENU_DIALOG_H_ */
diff --git a/repos/gems/src/app/launcher/menu_view_slave.h b/repos/gems/src/app/launcher/menu_view_slave.h
deleted file mode 100644
index e8ef3cdf35..0000000000
--- a/repos/gems/src/app/launcher/menu_view_slave.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * \brief Slave used for presenting the menu
- * \author Norman Feske
- * \date 2014-09-30
- */
-
-/*
- * Copyright (C) 2014-2017 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 _MENU_VIEW_SLAVE_H_
-#define _MENU_VIEW_SLAVE_H_
-
-/* Genode includes */
-#include
-#include
-#include
-#include
-
-/* gems includes */
-#include
-
-/* local includes */
-#include
-
-namespace Launcher { class Menu_view_slave; }
-
-
-class Launcher::Menu_view_slave
-{
- public:
-
- typedef Surface_base::Point Position;
-
- private:
-
- struct Policy_base
- {
- Genode::Static_parent_services
- _parent_services;
-
- Policy_base(Env &env) : _parent_services(env) { }
- };
-
- class Policy : Policy_base, public Genode::Slave::Policy
- {
- private:
-
- Genode::Single_session_service _nitpicker;
- Genode::Single_session_service _dialog_rom;
- Genode::Single_session_service _hover_report;
-
- Position _position;
-
- private:
-
- void _configure(Position pos)
- {
- char config[1024];
-
- snprintf(config, sizeof(config),
- "\n"
- " \n"
- " \n"
- " \n"
- " \n"
- " \n"
- " \n"
- "",
- pos.x(), pos.y());
-
- configure(config);
- }
-
- static Name _name() { return "menu_view"; }
- static Genode::Ram_quota _quota() { return { 6*1024*1024 }; }
- static Genode::Cap_quota _caps() { return { 100 }; }
-
- Service &_matching_service(Genode::Service::Name const &service,
- Genode::Session_label const &label)
- {
- if (service == "Nitpicker")
- return _nitpicker.service();
-
- if ((service == "ROM") && (label == "menu_view -> dialog"))
- return _dialog_rom.service();
-
- if ((service == "Report") && (label == "menu_view -> hover"))
- return _hover_report.service();
-
- throw Genode::Service_denied();
- }
-
- public:
-
- Policy(Genode::Env &env,
- Genode::Rpc_entrypoint &ep,
- Capability nitpicker_session,
- Capability dialog_rom_session,
- Capability hover_report_session,
- Position position)
- :
- Policy_base(env),
- Genode::Slave::Policy(env, _name(), _name(),
- Policy_base::_parent_services,
- ep, _caps(), _quota()),
- _nitpicker(env.rm(), nitpicker_session),
- _dialog_rom(dialog_rom_session),
- _hover_report(hover_report_session),
- _position(position)
- {
- _configure(position);
- }
-
- void position(Position pos) { _configure(pos); }
-
- Route resolve_session_request(Genode::Service::Name const &name,
- Genode::Session_label const &label) override
- {
- try {
- return Route { .service = _matching_service(name, label),
- .label = label,
- .diag = Genode::Session::Diag() };
- }
- catch (Genode::Service_denied) { }
-
- return Genode::Slave::Policy::resolve_session_request(name, label);
- }
- };
-
- Genode::size_t const _ep_stack_size = 4*1024*sizeof(Genode::addr_t);
- Genode::Rpc_entrypoint _ep;
- Policy _policy;
- Genode::Child _child;
-
- public:
-
- /**
- * Constructor
- */
- Menu_view_slave(Genode::Env &env,
- Capability nitpicker_session,
- Capability dialog_rom_session,
- Capability hover_report_session,
- Position initial_position)
- :
- _ep(&env.pd(), _ep_stack_size, "nit_fader"),
- _policy(env, _ep,
- nitpicker_session, dialog_rom_session,
- hover_report_session, initial_position),
- _child(env.rm(), _ep, _policy)
- { }
-
- void position(Position position) { _policy.position(position); }
-};
-
-#endif /* _NIT_FADER_SLAVE_H_ */
diff --git a/repos/gems/src/app/launcher/nit_fader_slave.h b/repos/gems/src/app/launcher/nit_fader_slave.h
deleted file mode 100644
index e551927fc8..0000000000
--- a/repos/gems/src/app/launcher/nit_fader_slave.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * \brief Slave used for toggling the visibility of a nitpicker session
- * \author Norman Feske
- * \date 2014-09-30
- */
-
-/*
- * Copyright (C) 2014-2017 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 _NIT_FADER_SLAVE_H_
-#define _NIT_FADER_SLAVE_H_
-
-/* Genode includes */
-#include
-#include
-#include
-
-/* local includes */
-#include
-
-namespace Launcher { class Nit_fader_slave; }
-
-
-class Launcher::Nit_fader_slave
-{
- private:
-
- struct Policy_base
- {
- Genode::Static_parent_services
- _parent_services;
-
- Policy_base(Env &env) : _parent_services(env) { }
- };
-
- class Policy : Policy_base, public Slave::Policy
- {
- private:
-
- Genode::Service &_nitpicker_service;
-
- protected:
-
- static Name _name() { return "nit_fader"; }
- static Genode::Ram_quota _quota() { return { 2*1024*1024 }; }
- static Genode::Cap_quota _caps() { return { 50 }; }
-
- public:
-
- Policy(Env &env,
- Rpc_entrypoint &ep,
- Genode::Service &nitpicker_service)
- :
- Policy_base(env),
- Genode::Slave::Policy(env, _name(), _name(),
- Policy_base::_parent_services,
- ep, _caps(), _quota()),
- _nitpicker_service(nitpicker_service)
- {
- visible(false);
- }
-
- void visible(bool visible)
- {
- char config[256];
- snprintf(config, sizeof(config),
- "", visible ? 255 : 0);
- configure(config, strlen(config) + 1);
- }
-
- Route resolve_session_request(Genode::Service::Name const &service,
- Genode::Session_label const &label) override
- {
- if (service == Nitpicker::Session::service_name())
- return Route { .service = _nitpicker_service,
- .label = label,
- .diag = Session::Diag() };
-
- return Genode::Slave::Policy::resolve_session_request(service, label);
- }
- };
-
- Policy _policy;
- Child _child;
-
- public:
-
- /**
- * Constructor
- *
- * \param ep entrypoint used for nitpicker child thread
- */
- Nit_fader_slave(Env &env,
- Rpc_entrypoint &ep,
- Genode::Service &nitpicker_service)
- :
- _policy(env, ep, nitpicker_service),
- _child(env.rm(), ep, _policy)
- {
- visible(false);
- }
-
- Genode::Slave::Policy &policy() { return _policy; }
-
- void visible(bool visible)
- {
- _policy.visible(visible);
- }
-};
-
-#endif /* _NIT_FADER_SLAVE_H_ */
diff --git a/repos/gems/src/app/launcher/panel_dialog.h b/repos/gems/src/app/launcher/panel_dialog.h
deleted file mode 100644
index 5ee6a684b0..0000000000
--- a/repos/gems/src/app/launcher/panel_dialog.h
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * \brief Panel dialog
- * \author Norman Feske
- * \date 2015-10-07
- */
-
-/*
- * Copyright (C) 2015-2017 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 _PANEL_DIALOG_H_
-#define _PANEL_DIALOG_H_
-
-/* Genode includes */
-#include
-#include
-
-/* local includes */
-#include
-#include
-#include
-#include
-
-namespace Launcher { struct Panel_dialog; }
-
-
-class Launcher::Panel_dialog : Input_event_handler, Dialog_generator,
- Hover_handler, Dialog_model,
- Context_dialog::Response_handler,
- Menu_dialog::Response_handler
-{
- private:
-
- typedef String<128> Title;
-
- struct Element : List::Element
- {
- Label const label;
- Title const title;
-
- bool hovered = false;
- bool touched = false;
- bool selected = false;
-
- Element(Label label, Title title) : label(label), title(title)
- { }
- };
-
- Genode::Allocator &_alloc;
-
- Constructible _config;
-
- List _elements;
-
- Label _focus;
-
- static char const *_menu_button_label() { return "_menu"; }
-
- Element _menu_button { _menu_button_label(), "Menu" };
-
- bool _focused(Element const &e)
- {
- size_t const label_len = strlen(e.label.string());
-
- if (strcmp(e.label.string(), _focus.string(), label_len))
- return false;
-
- /*
- * Even when the strcmp suceeded, the element's label might
- * not match the focus. E.g., if two subsystems "scout" and
- * "scoutx" are present the focus of "scoutx" would match both
- * subsystem labels because the strcmp is limited to the length
- * of the subsystem label. Hence, we need to make sure that
- * the focus matched at a separator boundary.
- */
- char const *char_after_label = _focus.string() + label_len;
-
- if (*char_after_label == 0 || !strcmp(" -> ", char_after_label, 4))
- return true;
-
- return false;
- }
-
- void _generate_dialog_element(Xml_generator &xml, Element const &e)
- {
- xml.node("button", [&] () {
- xml.attribute("name", e.label.string());
-
- if (&e != &_menu_button)
- xml.attribute("style", "subdued");
-
- if ((e.hovered && !_click_in_progress)
- || (e.hovered && e.touched))
- xml.attribute("hovered", "yes");
-
- if (e.selected || e.touched || _focused(e))
- xml.attribute("selected", "yes");
-
- xml.node("label", [&] () {
- xml.attribute("text", e.title.string());
- });
- });
- }
-
- class Lookup_failed { };
-
- Element const &_lookup_const(Label const &label) const
- {
- for (Element const *e = _elements.first(); e; e = e->next())
- if (e->label == label)
- return *e;
-
- throw Lookup_failed();
- }
-
- Element &_lookup(Label const &label)
- {
- for (Element *e = _elements.first(); e; e = e->next())
- if (e->label == label)
- return *e;
-
- throw Lookup_failed();
- }
-
- Fading_dialog::Position _position { 0, 0 };
-
- Timer::Connection _timer;
- Subsystem_manager &_subsystem_manager;
- Nitpicker::Session &_nitpicker;
- Fading_dialog _dialog;
-
- Rect _hovered_rect;
-
- unsigned _key_cnt = 0;
- Element *_clicked = nullptr;
- bool _click_in_progress = false;
-
- Signal_handler _timer_handler;
-
- Label _context_subsystem;
- Context_dialog _context_dialog;
-
- Menu_dialog _menu_dialog;
-
- Element *_hovered()
- {
- for (Element *e = _elements.first(); e; e = e->next())
- if (e->hovered)
- return e;
-
- return nullptr;
- }
-
- /**
- * Lookup subsystem in config
- */
- static Xml_node _subsystem(Xml_node config, char const *name)
- {
- Xml_node node = config.sub_node("subsystem");
- for (;; node = node.next("subsystem")) {
- if (node.attribute("name").has_value(name))
- return node;
- }
- }
-
- void _start(Label const &label)
- {
- if (!_config.constructed()) {
- warning("attempt to start subsystem without prior configuration");
- return;
- }
-
- try {
- Xml_node subsystem = _subsystem(_config->xml(), label.string());
- _subsystem_manager.start(subsystem);
-
- Title const title = subsystem.attribute_value("title", Title());
-
- Element *e = new (_alloc) Element(label, title);
-
- /* find last element of the list */
- Element *at = _elements.first();
- for (; at && at->next(); at = at->next());
-
- _elements.insert(e, at);
-
- dialog_changed();
-
- } catch (Xml_node::Nonexistent_sub_node) {
- Genode::error("no subsystem config found for \"", label, "\"");
- } catch (Subsystem_manager::Invalid_config) {
- Genode::error("invalid subsystem configuration for \"", label, "\"");
- }
- }
-
- void _kill(Label const &label)
- {
- Element &e = _lookup(label);
-
- _subsystem_manager.kill(label.string());
-
- _elements.remove(&e);
-
- if (_clicked == &e)
- _clicked = nullptr;
-
- Genode::destroy(_alloc, &e);
-
- dialog_changed();
- _dialog.update();
-
- _context_dialog.close();
-
- _menu_dialog.running(label, false);
- }
-
- void _hide(Label const &label)
- {
- _nitpicker.session_control(selector(label.string()),
- Nitpicker::Session::SESSION_CONTROL_HIDE);
-
- _context_dialog.close();
- }
-
- void _open_context_dialog(Label const &label)
- {
- /* reset touch state in each element */
- for (Element *e = _elements.first(); e; e = e->next())
- e->touched = false;
-
- Fading_dialog::Position position(_hovered_rect.p1().x(),
- _hovered_rect.p2().y());
-
- _context_subsystem = label;
- _context_dialog.position(_position + position);
- _context_dialog.visible(true);
- }
-
- void _handle_timer()
- {
- if (_click_in_progress && _clicked && _hovered() == _clicked) {
- _open_context_dialog(_clicked->label);
- }
- _click_in_progress = false;
- }
-
- void _to_front(Label const &label)
- {
- _nitpicker.session_control(selector(label.string()),
- Nitpicker::Session::SESSION_CONTROL_TO_FRONT);
- _nitpicker.session_control(selector(label.string()),
- Nitpicker::Session::SESSION_CONTROL_SHOW);
- }
-
- public:
-
- Panel_dialog(Env &env,
- Genode::Allocator &alloc,
- Report_rom_slave &report_rom_slave,
- Subsystem_manager &subsystem_manager,
- Nitpicker::Session &nitpicker)
- :
- _alloc(alloc),
- _timer(env),
- _subsystem_manager(subsystem_manager),
- _nitpicker(nitpicker),
- _dialog(env, report_rom_slave, "panel_dialog", "panel_hover",
- *this, *this, *this, *this, _position),
- _timer_handler(env.ep(), *this, &Panel_dialog::_handle_timer),
- _context_dialog(env, report_rom_slave, *this),
- _menu_dialog(env, alloc, report_rom_slave, *this)
- {
- _elements.insert(&_menu_button);
- _timer.sigh(_timer_handler);
- }
-
- /**
- * Dialog_generator interface
- */
- void generate_dialog(Xml_generator &xml) override
- {
- xml.node("hbox", [&] () {
- for (Element const *e = _elements.first(); e; e = e->next())
- _generate_dialog_element(xml, *e);
- });
- }
-
- Rect _hovered_button_rect(Xml_node hover) const
- {
- Point p(0, 0);
-
- for (;; hover = hover.sub_node()) {
-
- p = p + Point(point_attribute(hover));
-
- if (hover.has_type("button"))
- return Rect(p, area_attribute(hover));
-
- if (!hover.num_sub_nodes())
- break;
- }
-
- return Rect();
- }
-
- /**
- * Hover_handler interface
- */
- void hover_changed(Xml_node hover) override
- {
- Element *old_hovered = _hovered();
-
- for (Element *e = _elements.first(); e; e = e->next())
- e->hovered = false;
-
- try {
- Xml_node button = hover.sub_node("dialog")
- .sub_node("hbox")
- .sub_node("button");
-
- for (Element *e = _elements.first(); e; e = e->next()) {
-
- Label const label = button.attribute_value("name", Label(""));
-
- if (e->label == label) {
- e->hovered = true;
-
- _hovered_rect = _hovered_button_rect(hover);
- }
- }
- } catch (Xml_node::Nonexistent_sub_node) { }
-
- Element *new_hovered = _hovered();
-
- if (old_hovered != new_hovered)
- dialog_changed();
- }
-
- /**
- * Input_event_handler interface
- */
- bool handle_input_event(Input::Event const &ev) override
- {
- if (ev.hover_leave()) {
-
- /*
- * Let menu dialog disappear when the panel is unhovered. One
- * would expect that the user had no chance to select an item
- * from the menu because when entering the menu, we will no
- * longer hover the panel. However, the menu disappears slowly.
- * If the pointer moves over to the menu in a reasonable time,
- * the visiblity of the menu is re-enabled.
- */
- _menu_dialog.visible(false);
- _context_dialog.visible(false);
- _menu_button.selected = false;
- _dialog.update();
- return true;
- }
-
- if (ev.absolute_motion())
- return true;
-
- if (ev.press()) _key_cnt++;
- if (ev.release()) _key_cnt--;
-
- if (ev.key_press(Input::BTN_LEFT) && _key_cnt == 1) {
-
- _context_dialog.visible(false);
-
- Element *hovered = _hovered();
-
- _click_in_progress = true;
- _clicked = hovered;
-
- if (!hovered)
- return false;
-
- hovered->touched = true;
-
- if (hovered == &_menu_button) {
-
- /* menu button presses */
- if (_menu_button.selected)
- _menu_dialog.close();
- else
- _menu_dialog.visible(true);
-
- _menu_button.selected = !_menu_button.selected;
- _dialog.update();
- return false;
- }
-
- _menu_dialog.close();
-
- _to_front(hovered->label);
-
- /*
- * Open the context dialog after the user keeps pressing the
- * button for a while.
- */
- enum { CONTEXT_DELAY = 500 };
- _timer.trigger_once((Genode::uint64_t)CONTEXT_DELAY*1000);
- }
-
- /*
- * Open context dialog on right click
- */
- if (ev.key_press(Input::BTN_RIGHT) && _key_cnt == 1) {
-
- Element *hovered = _hovered();
-
- if (hovered && hovered != &_menu_button)
- _open_context_dialog(hovered->label);
- }
-
- if (ev.release() && _click_in_progress && _key_cnt == 0) {
-
- Element *hovered = _hovered();
-
- if (hovered)
- hovered->touched = false;
-
- _clicked = nullptr;
- _click_in_progress = false;
- }
-
- return false;
- }
-
- /**
- * Context_dialog::Response_handler interface
- */
- void handle_context_kill() override
- {
- _kill(_context_subsystem);
- }
-
- /**
- * Context_dialog::Response_handler interface
- */
- void handle_context_hide() override
- {
- _hide(_context_subsystem);
- }
-
- /**
- * Menu_dialog::Response_handler interface
- */
- void handle_menu_motion()
- {
- _menu_button.selected = true;
- _dialog.update();
- }
-
- /**
- * Menu_dialog::Response_handler interface
- */
- void handle_menu_leave()
- {
- /* XXX eventually revert the state of the menu button */
- _menu_button.selected = false;
-
- _dialog.update();
-
- _menu_dialog.visible(false);
- }
-
- /**
- * Menu_dialog::Response_handler interface
- */
- void handle_selection(Label const &label) override
- {
- /*
- * If subsystem of the specified label is already running, ignore
- * the click.
- */
- bool already_running = false;
- for (Element *e = _elements.first(); e; e = e->next())
- if (e->label == label)
- already_running = true;
-
- if (already_running) {
- _to_front(label);
-
- } else {
-
- _start(label);
-
- _dialog.update();
-
- /* propagate running state of subsystem to menu dialog */
- _menu_dialog.running(label, true);
- }
-
- /* let menu disappear */
- _menu_dialog.close();
- }
-
- void visible(bool visible)
- {
- _dialog.visible(visible);
-
- if (!visible)
- _context_dialog.visible(false);
- }
-
- void kill(Label const &label)
- {
- _kill(label);
- }
-
- /**
- * \throw Allocator::Out_of_memory
- */
- void update(Xml_node config)
- {
- _config.construct(_alloc, config);
-
- /* populate menu dialog with one item per subsystem */
- _menu_dialog.update(_config->xml());
-
- /* evaluate configuration */
- _dialog.update();
- }
-
- void focus_changed(Label const &label)
- {
- _focus = label;
-
- _dialog.update();
- }
-
- void focus_next()
- {
- /* find focused element */
- Element *e = _elements.first();
-
- for (; e && !_focused(*e); e = e->next());
-
- /* none of our subsystems is focused, start with the first one */
- if (!e)
- e = _elements.first();
-
- /*
- * Determine next session in the list, if we reach the end, start
- * at the beginning (the element right after the menu button.
- */
- Element *new_focused = e->next() ? e->next() : _menu_button.next();
-
- if (new_focused)
- _to_front(new_focused->label);
- }
-};
-
-#endif /* _PANEL_DIALOG_H_ */
diff --git a/repos/gems/src/app/launcher/subsystem_manager.h b/repos/gems/src/app/launcher/subsystem_manager.h
deleted file mode 100644
index 2543e2554f..0000000000
--- a/repos/gems/src/app/launcher/subsystem_manager.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * \brief Management of subsystems
- * \author Norman Feske
- * \date 2014-10-02
- */
-
-/*
- * Copyright (C) 2014-2017 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 _SUBSYSTEM_MANAGER_H_
-#define _SUBSYSTEM_MANAGER_H_
-
-/* Genode includes */
-#include
-#include
-
-/* CLI-monitor includes */
-#include
-
-namespace Launcher {
-
- class Subsystem_manager;
- using Cli_monitor::Ram;
- using namespace Genode;
-}
-
-
-class Launcher::Subsystem_manager
-{
- public:
-
- /**
- * Exception types
- */
- class Invalid_config { };
-
- private:
-
- Env & _env;
- Heap _heap { _env.ram(), _env.rm() };
- size_t const _ram_preservation;
-
- struct Child : Cli_monitor::Child_base, List::Element
- {
- template
- Child(ARGS &&... args) : Child_base(args...) { }
- };
-
- List _children;
-
- void _try_response_to_resource_request()
- {
- for (Child *child = _children.first(); child; child = child->next())
- child->try_response_to_resource_request();
- }
-
- Signal_handler _yield_broadcast_handler =
- { _env.ep(), *this, &Subsystem_manager::_handle_yield_broadcast };
-
- void _handle_yield_broadcast()
- {
- _try_response_to_resource_request();
-
- /*
- * XXX copied from 'cli_monitor/main.cc'
- */
-
- /*
- * Compute argument of yield request to be broadcasted to all
- * processes.
- */
- size_t amount = 0;
-
- /* amount needed to reach preservation limit */
- Ram::Status ram_status = _ram.status();
- if (ram_status.avail < ram_status.preserve)
- amount += ram_status.preserve - ram_status.avail;
-
- /* sum of pending resource requests */
- for (Child *child = _children.first(); child; child = child->next())
- amount += child->requested_ram_quota();
-
- for (Child *child = _children.first(); child; child = child->next())
- child->yield(amount, true);
- }
-
- Signal_handler _resource_avail_handler =
- { _env.ep(), *this, &Subsystem_manager::_handle_resource_avail };
-
- void _handle_resource_avail()
- {
- _try_response_to_resource_request();
- }
-
- Signal_handler _yield_response_handler =
- { _env.ep(), *this, &Subsystem_manager::_handle_yield_response };
-
- void _handle_yield_response()
- {
- _try_response_to_resource_request();
- }
-
- Genode::Signal_context_capability _exited_child_sig_cap;
-
- Ram _ram { _env.pd(),
- _env.pd_session_cap(),
- _ram_preservation,
- _yield_broadcast_handler,
- _resource_avail_handler };
-
- static Child::Binary_name _binary_name(Xml_node subsystem)
- {
- try {
- return subsystem.sub_node("binary")
- .attribute_value("name", Child::Binary_name());
- } catch (Xml_node::Nonexistent_sub_node) {
- Genode::error("missing definition");
- throw Invalid_config();
- }
- }
-
- struct Ram_config { Number_of_bytes quantum, limit; };
-
- static Ram_config _ram_config(Xml_node subsystem)
- {
- Number_of_bytes quantum = 0, limit = 0;
- try {
- subsystem.for_each_sub_node("resource", [&] (Xml_node rsc) {
- if (rsc.attribute("name").has_value("RAM")) {
-
- rsc.attribute("quantum").value(quantum);
-
- if (rsc.has_attribute("limit"))
- rsc.attribute("limit").value(limit);
- }
- });
- } catch (...) {
- Genode::error("invalid RAM resource declaration");
- throw Invalid_config();
- }
-
- return Ram_config { quantum, limit };
- }
-
- static Cap_quota _caps_config(Xml_node subsystem)
- {
- Cap_quota const caps { subsystem.attribute_value("caps", 0UL) };
-
- if (caps.value)
- return caps;
-
- Genode::error("missing 'caps' attribute for ",
- subsystem.attribute_value("name", Label()));
- throw Invalid_config();
- }
-
- public:
-
- Subsystem_manager(Genode::Env & env,
- size_t ram_preservation,
- Genode::Signal_context_capability exited_child_sig_cap)
- :
- _env(env), _ram_preservation(ram_preservation),
- _exited_child_sig_cap(exited_child_sig_cap)
- { }
-
- /**
- * Start subsystem
- *
- * \throw Invalid_config
- */
- void start(Xml_node subsystem)
- {
- Child::Binary_name const binary_name = _binary_name(subsystem);
-
- Label const label = subsystem.attribute_value("name", Label(""));
-
- Ram_config const ram_config = _ram_config(subsystem);
-
- Genode::log("starting child '", label.string(), "'");
-
- try {
- Child *child = new (_heap)
- Child(_env, _ram, _heap, label, binary_name.string(),
- _env.pd(),
- _env.pd_session_cap(),
- _env.rm(),
- _caps_config(subsystem),
- ram_config.quantum, ram_config.limit,
- _yield_broadcast_handler,
- _exited_child_sig_cap);
-
- auto configure_with_xml = [&] (Xml_node config)
- {
- config.with_raw_node([&] (char const *start, size_t length) {
- child->configure(start, length); });
- };
-
- /* configure child */
- try {
- if (subsystem.has_sub_node("configfile")) {
- Xml_node const node = subsystem.sub_node("configfile");
-
- typedef Genode::String<96> Name;
- Name const name = node.attribute_value("name", Name());
-
- Attached_rom_dataspace rom(_env, name.string());
- configure_with_xml(rom.xml());
-
- } else if (subsystem.has_sub_node("config")) {
- configure_with_xml(subsystem.sub_node("config"));
- } else {
- configure_with_xml(Xml_node(""));
- }
- } catch (...) { warning("failed to configure child ", label); }
-
- _children.insert(child);
-
- child->start();
- }
- catch (Service_denied) {
- Genode::error("failed to start ", binary_name);
- throw Invalid_config();
- }
- }
-
- void kill(char const *label)
- {
- for (Child *c = _children.first(); c; c = c->next()) {
- if (c->label() == Label(label)) {
- _children.remove(c);
- destroy(_heap, c);
- return;
- }
- }
- }
-
- /**
- * Call functor for each exited child
- *
- * The functor takes a 'Label' as argument.
- */
- template
- void for_each_exited_child(FUNC const &func)
- {
- Child *next = nullptr;
- for (Child *child = _children.first(); child; child = next) {
- next = child->next();
- if (child->exited())
- func(Label(child->label().string()));
- }
- }
-};
-
-#endif /* _SUBSYSTEM_MANAGER_H_ */
diff --git a/repos/gems/src/app/launcher/target.mk b/repos/gems/src/app/launcher/target.mk
deleted file mode 100644
index ed3fda2bd4..0000000000
--- a/repos/gems/src/app/launcher/target.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-TARGET = launcher
-SRC_CC = main.cc
-LIBS = base
-INC_DIR += $(PRG_DIR)
-
-CC_CXX_WARN_STRICT =
diff --git a/repos/gems/src/app/launcher/types.h b/repos/gems/src/app/launcher/types.h
deleted file mode 100644
index cd2fe22e6a..0000000000
--- a/repos/gems/src/app/launcher/types.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * \brief Common types for launcher
- * \author Norman Feske
- * \date 2014-09-30
- */
-
-/*
- * Copyright (C) 2014-2017 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 _TYPES_H_
-#define _TYPES_H_
-
-/* Genode includes */
-#include
-#include
-
-namespace Launcher {
- using namespace Genode;
-
- typedef String<128> Label;
-
- static Nitpicker::Session::Label selector(Label label)
- {
- /*
- * Append label separator to uniquely identify the subsystem.
- * Otherwise, the selector may be ambiguous if the label of one
- * subsystem starts with the label of another subsystem.
- */
- char selector[Nitpicker::Session::Label::size()];
- snprintf(selector, sizeof(selector), "%s ->", label.string());
- return Nitpicker::Session::Label(Cstring(selector));
- }
-
- using Decorator::area_attribute;
- using Decorator::point_attribute;
-
- typedef Nitpicker::Point Point;
- typedef Nitpicker::Rect Rect;
-}
-
-#endif /* _TYPES_H_ */