diff --git a/repos/demo/include/launchpad/launchpad.h b/repos/demo/include/launchpad/launchpad.h index 05206e295..f73e2c653 100644 --- a/repos/demo/include/launchpad/launchpad.h +++ b/repos/demo/include/launchpad/launchpad.h @@ -231,7 +231,7 @@ class Launchpad /** * Process launchpad XML configuration */ - void process_config(); + void process_config(Genode::Xml_node); /************************* diff --git a/repos/demo/src/app/launchpad/main.cc b/repos/demo/src/app/launchpad/main.cc index 8411d1bb9..bbd7b42b2 100644 --- a/repos/demo/src/app/launchpad/main.cc +++ b/repos/demo/src/app/launchpad/main.cc @@ -12,6 +12,7 @@ */ #include +#include #include #include @@ -25,7 +26,6 @@ #include #include -#include /** @@ -77,16 +77,6 @@ class Avail_quota_update : public Scout::Tick }; -static long read_int_attr_from_config(const char *attr, long default_value) -{ - long result = default_value; - try { - Genode::config()->xml_node().attribute(attr).value(&result); - } catch (...) { } - return result; -} - - struct Main : Scout::Event_handler { Scout::Platform &_pf; @@ -134,10 +124,12 @@ void Component::construct(Genode::Env &env) static Nitpicker::Connection nitpicker(env); static Platform pf(env, *nitpicker.input()); - long initial_x = read_int_attr_from_config("xpos", 550); - long initial_y = read_int_attr_from_config("ypos", 150); - long initial_w = read_int_attr_from_config("width", 400); - long initial_h = read_int_attr_from_config("height", 400); + static Genode::Attached_rom_dataspace config(env, "config"); + + long const initial_x = config.xml().attribute_value("xpos", 550U); + long const initial_y = config.xml().attribute_value("ypos", 150U); + long const initial_w = config.xml().attribute_value("width", 400U); + long const initial_h = config.xml().attribute_value("height", 400U); Area const max_size (530, 620); Point const initial_position(initial_x, initial_y); @@ -152,7 +144,7 @@ void Component::construct(Genode::Env &env) max_size, env.ram().avail()); /* request config file from ROM service */ - try { launchpad.process_config(); } catch (...) { } + try { launchpad.process_config(config.xml()); } catch (...) { } static Avail_quota_update avail_quota_update(&launchpad); diff --git a/repos/demo/src/app/launchpad/target.mk b/repos/demo/src/app/launchpad/target.mk index 4cecb63cf..c74722f49 100644 --- a/repos/demo/src/app/launchpad/target.mk +++ b/repos/demo/src/app/launchpad/target.mk @@ -1,5 +1,5 @@ TARGET = launchpad -LIBS = launchpad scout_widgets config +LIBS = launchpad scout_widgets SRC_CC = launchpad_window.cc \ launcher.cc \ main.cc diff --git a/repos/demo/src/app/scout/target.mk b/repos/demo/src/app/scout/target.mk index ed38c6b9d..ae9286507 100644 --- a/repos/demo/src/app/scout/target.mk +++ b/repos/demo/src/app/scout/target.mk @@ -1,5 +1,5 @@ TARGET = scout -LIBS = libpng_static libz_static mini_c launchpad scout_widgets config +LIBS = libpng_static libz_static mini_c launchpad scout_widgets SRC_CC = main.cc doc.cc \ browser_window.cc png_image.cc \ navbar.cc about.cc \ diff --git a/repos/demo/src/lib/launchpad/launchpad.cc b/repos/demo/src/lib/launchpad/launchpad.cc index 87e463af0..599abed1a 100644 --- a/repos/demo/src/lib/launchpad/launchpad.cc +++ b/repos/demo/src/lib/launchpad/launchpad.cc @@ -17,7 +17,6 @@ #include #include #include -#include #include using namespace Genode; @@ -91,12 +90,10 @@ Launchpad::_get_unique_child_name(Launchpad_child::Name const &binary_name) /** * Process launchpad XML configuration */ -void Launchpad::process_config() +void Launchpad::process_config(Genode::Xml_node config_node) { using namespace Genode; - Xml_node config_node = config()->xml_node(); - /* * Iterate through all entries of the config file and create * launchpad entries as specified. diff --git a/repos/gems/include/nano3d/scene.h b/repos/gems/include/nano3d/scene.h index 467cba4c8..a00485ee1 100644 --- a/repos/gems/include/nano3d/scene.h +++ b/repos/gems/include/nano3d/scene.h @@ -20,6 +20,7 @@ #define _INCLUDE__NANO3D__SCENE_H_ /* Genode includes */ +#include #include #include #include @@ -54,7 +55,7 @@ class Nano3d::Scene private: - Genode::Signal_receiver &_sig_rec; + Genode::Env &_env; /** * Position and size of nitpicker view @@ -62,7 +63,7 @@ class Nano3d::Scene Nitpicker::Point const _pos; Nitpicker::Area const _size; - Nitpicker::Connection _nitpicker; + Nitpicker::Connection _nitpicker { _env }; struct Mapped_framebuffer { @@ -186,28 +187,28 @@ class Nano3d::Scene bool _do_sync = false; - Timer::Connection _timer; + Timer::Connection _timer { _env }; Genode::Attached_dataspace _input_ds { _nitpicker.input()->dataspace() }; - Input_handler *_input_handler = nullptr; + Input_handler *_input_handler_callback = nullptr; - void _handle_input(unsigned) + void _handle_input() { - if (!_input_handler) + if (!_input_handler_callback) return; while (int num = _nitpicker.input()->flush()) { auto const *ev_buf = _input_ds.local_addr(); - if (_input_handler) - _input_handler->handle_input(ev_buf, num); + if (_input_handler_callback) + _input_handler_callback->handle_input(ev_buf, num); } } - Genode::Signal_dispatcher _input_dispatcher { - _sig_rec, *this, &Scene::_handle_input }; + Genode::Signal_handler _input_handler { + _env.ep(), *this, &Scene::_handle_input }; void _swap_back_and_front_surfaces() { @@ -223,7 +224,7 @@ class Nano3d::Scene _surface_front = tmp; } - void _handle_period(unsigned) + void _handle_period() { if (_do_sync) return; @@ -238,10 +239,10 @@ class Nano3d::Scene _do_sync = true; } - Genode::Signal_dispatcher _periodic_dispatcher { - _sig_rec, *this, &Scene::_handle_period }; + Genode::Signal_handler _periodic_handler { + _env.ep(), *this, &Scene::_handle_period }; - void _handle_sync(unsigned) + void _handle_sync() { /* rendering of scene is not complete, yet */ if (!_do_sync) @@ -263,42 +264,29 @@ class Nano3d::Scene _do_sync = false; } - Genode::Signal_dispatcher _sync_dispatcher { - _sig_rec, *this, &Scene::_handle_sync }; + Genode::Signal_handler _sync_handler { + _env.ep(), *this, &Scene::_handle_sync }; typedef Nitpicker::Session::Command Command; public: - Scene(Genode::Signal_receiver &sig_rec, unsigned update_rate_ms, + Scene(Genode::Env &env, unsigned update_rate_ms, Nitpicker::Point pos, Nitpicker::Area size) : - _sig_rec(sig_rec), _pos(pos), _size(size) + _env(env), _pos(pos), _size(size) { Nitpicker::Rect rect(_pos, _size); _nitpicker.enqueue(_view_handle, rect); _nitpicker.enqueue(_view_handle); _nitpicker.execute(); - _nitpicker.input()->sigh(_input_dispatcher); + _nitpicker.input()->sigh(_input_handler); - _timer.sigh(_periodic_dispatcher); + _timer.sigh(_periodic_handler); _timer.trigger_periodic(1000*update_rate_ms); - _framebuffer.framebuffer.sync_sigh(_sync_dispatcher); - } - - static void dispatch_signals_loop(Genode::Signal_receiver &sig_rec) - { - while (1) { - - Genode::Signal signal = sig_rec.wait_for_signal(); - - Genode::Signal_dispatcher_base *dispatcher = - static_cast(signal.context()); - - dispatcher->dispatch(signal.num()); - } + _framebuffer.framebuffer.sync_sigh(_sync_handler); } unsigned long elapsed_ms() const { return _timer.elapsed_ms(); } @@ -306,7 +294,7 @@ class Nano3d::Scene void input_handler(Input_handler *input_handler) { _framebuffer.input_mask(input_handler ? true : false); - _input_handler = input_handler; + _input_handler_callback = input_handler; } }; diff --git a/repos/gems/src/app/cpu_load_display/main.cc b/repos/gems/src/app/cpu_load_display/main.cc index 742fb2ce2..24a54ce77 100644 --- a/repos/gems/src/app/cpu_load_display/main.cc +++ b/repos/gems/src/app/cpu_load_display/main.cc @@ -12,7 +12,7 @@ */ /* Genode includes */ -#include +#include #include #include #include @@ -274,14 +274,15 @@ class Cpu_load_display::Scene : public Nano3d::Scene { private: + Genode::Env &_env; + Nitpicker::Area const _size; - void _handle_config(unsigned) - { - Genode::config()->reload(); - } + Genode::Attached_rom_dataspace _config { _env, "config" }; - Genode::Signal_dispatcher _config_dispatcher; + void _handle_config() { _config.update(); } + + Genode::Signal_handler _config_handler; Genode::Attached_rom_dataspace _trace_subjects { "trace_subjects" }; @@ -289,7 +290,7 @@ class Cpu_load_display::Scene : public Nano3d::Scene Cpu_registry _cpu_registry; - void _handle_trace_subjects(unsigned) + void _handle_trace_subjects() { _trace_subjects.update(); @@ -304,21 +305,22 @@ class Cpu_load_display::Scene : public Nano3d::Scene } catch (...) { Genode::error("failed to import trace subjects"); } } - Genode::Signal_dispatcher _trace_subjects_dispatcher; + Genode::Signal_handler _trace_subjects_handler; public: - Scene(Genode::Signal_receiver &sig_rec, unsigned update_rate_ms, + Scene(Genode::Env &env, unsigned update_rate_ms, Nitpicker::Point pos, Nitpicker::Area size) : - Nano3d::Scene(sig_rec, update_rate_ms, pos, size), _size(size), - _config_dispatcher(sig_rec, *this, &Scene::_handle_config), - _trace_subjects_dispatcher(sig_rec, *this, &Scene::_handle_trace_subjects) + Nano3d::Scene(env, update_rate_ms, pos, size), + _env(env), _size(size), + _config_handler(env.ep(), *this, &Scene::_handle_config), + _trace_subjects_handler(env.ep(), *this, &Scene::_handle_trace_subjects) { - Genode::config()->sigh(_config_dispatcher); - _handle_config(0); + _config.sigh(_config_handler); + _handle_config(); - _trace_subjects.sigh(_trace_subjects_dispatcher); + _trace_subjects.sigh(_trace_subjects_handler); } private: @@ -456,17 +458,11 @@ class Cpu_load_display::Scene : public Nano3d::Scene }; -int main(int argc, char **argv) +void Component::construct(Genode::Env &env) { - static Genode::Signal_receiver sig_rec; - enum { UPDATE_RATE_MS = 250 }; static Cpu_load_display::Scene - scene(sig_rec, UPDATE_RATE_MS, + scene(env, UPDATE_RATE_MS, Nitpicker::Point(0, 0), Nitpicker::Area(400, 400)); - - scene.dispatch_signals_loop(sig_rec); - - return 0; } diff --git a/repos/gems/src/app/menu_view/main.cc b/repos/gems/src/app/menu_view/main.cc index 82a7594c3..525216152 100644 --- a/repos/gems/src/app/menu_view/main.cc +++ b/repos/gems/src/app/menu_view/main.cc @@ -24,64 +24,68 @@ struct Menu_view::Main { - Nitpicker::Connection nitpicker; + Env &_env; - Constructible buffer; + Nitpicker::Connection _nitpicker { _env }; - Nitpicker::Session::View_handle view_handle = nitpicker.create_view(); + Constructible _buffer; - Point position; + Nitpicker::Session::View_handle _view_handle = _nitpicker.create_view(); + + Point _position; Rect _view_geometry; void _update_view() { - if (_view_geometry.p1() == position - && _view_geometry.area() == buffer->size()) - return; + if (_view_geometry.p1() == _position + && _view_geometry.area() == _buffer->size()) + return; /* display view behind all others */ typedef Nitpicker::Session::Command Command; - _view_geometry = Rect(position, buffer->size()); - nitpicker.enqueue(view_handle, _view_geometry); - nitpicker.enqueue(view_handle); - nitpicker.execute(); + _view_geometry = Rect(_position, _buffer->size()); + _nitpicker.enqueue(_view_handle, _view_geometry); + _nitpicker.enqueue(_view_handle); + _nitpicker.execute(); } - Signal_receiver &sig_rec; - /** * Function called on config change or mode change */ - void handle_dialog_update(unsigned); + void _handle_dialog_update(); - Signal_dispatcher
dialog_update_dispatcher = { - sig_rec, *this, &Main::handle_dialog_update}; + Signal_handler
_dialog_update_handler = { + _env.ep(), *this, &Main::_handle_dialog_update}; - Style_database styles; + Style_database _styles; - Animator animator; + Animator _animator; - Widget_factory widget_factory { *env()->heap(), styles, animator }; + Heap _heap { _env.ram(), _env.rm() }; - Root_widget root_widget { widget_factory, Xml_node(""), Widget::Unique_id() }; + Widget_factory _widget_factory { _heap, _styles, _animator }; - Attached_rom_dataspace dialog_rom { "dialog" }; + Root_widget _root_widget { _widget_factory, Xml_node(""), Widget::Unique_id() }; - Attached_dataspace input_ds { nitpicker.input()->dataspace() }; + Attached_rom_dataspace _dialog_rom { _env, "dialog" }; - Widget::Unique_id hovered; + Attached_dataspace _input_ds { _nitpicker.input()->dataspace() }; - void handle_config(unsigned); + Widget::Unique_id _hovered; - Signal_dispatcher
config_dispatcher = { - sig_rec, *this, &Main::handle_config}; + Attached_rom_dataspace _config { _env, "config" }; - void handle_input(unsigned); + void _handle_config(); - Signal_dispatcher
input_dispatcher = { - sig_rec, *this, &Main::handle_input}; + Signal_handler
_config_handler = { + _env.ep(), *this, &Main::_handle_config}; + + void _handle_input(); + + Signal_handler
_input_handler = { + _env.ep(), *this, &Main::_handle_input}; /* * Timer used for animating widgets @@ -94,21 +98,23 @@ struct Menu_view::Main void schedule() { trigger_once(Frame_timer::PERIOD*1000); } - } timer; + Frame_timer(Env &env) : Timer::Connection(env) { } - void handle_frame_timer(unsigned); + } _timer { _env }; - Signal_dispatcher
frame_timer_dispatcher = { - sig_rec, *this, &Main::handle_frame_timer}; + void _handle_frame_timer(); - Genode::Reporter hover_reporter = { "hover" }; + Signal_handler
_frame_timer_handler = { + _env.ep(), *this, &Main::_handle_frame_timer}; - bool schedule_redraw = false; + Genode::Reporter _hover_reporter = { "hover" }; + + bool _schedule_redraw = false; /** * Frame of last call of 'handle_frame_timer' */ - unsigned last_frame = 0; + unsigned _last_frame = 0; /** * Number of frames between two redraws @@ -120,86 +126,86 @@ struct Menu_view::Main * period, wraps at 'REDRAW_PERIOD'. The redraw is performed when the * counter wraps. */ - unsigned frame_cnt = 0; + unsigned _frame_cnt = 0; - Main(Signal_receiver &sig_rec) : sig_rec(sig_rec) + Main(Env &env) : _env(env) { - dialog_rom.sigh(dialog_update_dispatcher); - config()->sigh(config_dispatcher); + _dialog_rom.sigh(_dialog_update_handler); + _config.sigh(_config_handler); - nitpicker.input()->sigh(input_dispatcher); + _nitpicker.input()->sigh(_input_handler); - timer.sigh(frame_timer_dispatcher); + _timer.sigh(_frame_timer_handler); /* apply initial configuration */ - handle_config(0); + _handle_config(); } }; -void Menu_view::Main::handle_dialog_update(unsigned) +void Menu_view::Main::_handle_dialog_update() { try { - position = Decorator::point_attribute(config()->xml_node()); + _position = Decorator::point_attribute(_config.xml()); } catch (...) { } - dialog_rom.update(); + _dialog_rom.update(); try { - Xml_node dialog_xml(dialog_rom.local_addr()); + Xml_node dialog_xml(_dialog_rom.local_addr()); - root_widget.update(dialog_xml); - root_widget.size(root_widget.min_size()); + _root_widget.update(dialog_xml); + _root_widget.size(_root_widget.min_size()); } catch (...) { Genode::error("failed to construct widget tree"); } - schedule_redraw = true; + _schedule_redraw = true; /* * If we have not processed a period for at least one frame, perform the * processing immediately. This way, we avoid latencies when the dialog * model is updated sporadically. */ - if (timer.curr_frame() != last_frame) - handle_frame_timer(0); + if (_timer.curr_frame() != _last_frame) + _handle_frame_timer(); else - timer.schedule(); + _timer.schedule(); } -void Menu_view::Main::handle_config(unsigned) +void Menu_view::Main::_handle_config() { - config()->reload(); + _config.update(); try { - hover_reporter.enabled(config()->xml_node().sub_node("report") - .attribute_value("hover", false)); + _hover_reporter.enabled(_config.xml().sub_node("report") + .attribute_value("hover", false)); } catch (...) { - hover_reporter.enabled(false); + _hover_reporter.enabled(false); } - handle_dialog_update(0); + _handle_dialog_update(); } -void Menu_view::Main::handle_input(unsigned) +void Menu_view::Main::_handle_input() { - nitpicker.input()->for_each_event([&] (Input::Event const &ev) { + _nitpicker.input()->for_each_event([&] (Input::Event const &ev) { if (ev.absolute_motion()) { - Point const at = Point(ev.ax(), ev.ay()) - position; - Widget::Unique_id const new_hovered = root_widget.hovered(at); + Point const at = Point(ev.ax(), ev.ay()) - _position; + Widget::Unique_id const new_hovered = _root_widget.hovered(at); - if (hovered != new_hovered) { + if (_hovered != new_hovered) { - if (hover_reporter.enabled()) { - Genode::Reporter::Xml_generator xml(hover_reporter, [&] () { - root_widget.gen_hover_model(xml, at); + if (_hover_reporter.enabled()) { + Genode::Reporter::Xml_generator xml(_hover_reporter, [&] () { + _root_widget.gen_hover_model(xml, at); }); } - hovered = new_hovered; + _hovered = new_hovered; } } @@ -209,74 +215,74 @@ void Menu_view::Main::handle_input(unsigned) if ((ev.type() == Input::Event::FOCUS && ev.code() == 0) || (ev.type() == Input::Event::LEAVE)) { - hovered = Widget::Unique_id(); + _hovered = Widget::Unique_id(); - if (hover_reporter.enabled()) { - Genode::Reporter::Xml_generator xml(hover_reporter, [&] () { }); + if (_hover_reporter.enabled()) { + Genode::Reporter::Xml_generator xml(_hover_reporter, [&] () { }); } } }); } -void Menu_view::Main::handle_frame_timer(unsigned) +void Menu_view::Main::_handle_frame_timer() { - frame_cnt++; + _frame_cnt++; - unsigned const curr_frame = timer.curr_frame(); + unsigned const curr_frame = _timer.curr_frame(); - if (animator.active()) { + if (_animator.active()) { - unsigned const passed_frames = curr_frame - last_frame; + unsigned const passed_frames = curr_frame - _last_frame; if (passed_frames > 0) { for (unsigned i = 0; i < passed_frames; i++) - animator.animate(); + _animator.animate(); - schedule_redraw = true; + _schedule_redraw = true; } } - last_frame = curr_frame; + _last_frame = curr_frame; - if (schedule_redraw && frame_cnt >= REDRAW_PERIOD) { + if (_schedule_redraw && _frame_cnt >= REDRAW_PERIOD) { - frame_cnt = 0; + _frame_cnt = 0; - Area const old_size = buffer.constructed() ? buffer->size() : Area(); - Area const size = root_widget.min_size(); + Area const old_size = _buffer.constructed() ? _buffer->size() : Area(); + Area const size = _root_widget.min_size(); - if (!buffer.constructed() || size != old_size) - buffer.construct(nitpicker, size, *env()->ram_session()); + if (!_buffer.constructed() || size != old_size) + _buffer.construct(_nitpicker, size, _env.ram()); else - buffer->reset_surface(); + _buffer->reset_surface(); - root_widget.size(size); - root_widget.position(Point(0, 0)); + _root_widget.size(size); + _root_widget.position(Point(0, 0)); - Surface pixel_surface = buffer->pixel_surface(); - Surface alpha_surface = buffer->alpha_surface(); + Surface pixel_surface = _buffer->pixel_surface(); + Surface alpha_surface = _buffer->alpha_surface(); // XXX restrict redraw to dirty regions // don't perform a full dialog update - root_widget.draw(pixel_surface, alpha_surface, Point(0, 0)); + _root_widget.draw(pixel_surface, alpha_surface, Point(0, 0)); - buffer->flush_surface(); - nitpicker.framebuffer()->refresh(0, 0, buffer->size().w(), buffer->size().h()); + _buffer->flush_surface(); + _nitpicker.framebuffer()->refresh(0, 0, _buffer->size().w(), _buffer->size().h()); _update_view(); - schedule_redraw = false; + _schedule_redraw = false; } /* * Deactivate timer periods when idle, activate timer when an animation is * in progress or a redraw is pending. */ - bool const redraw_pending = schedule_redraw && frame_cnt != 0; + bool const redraw_pending = _schedule_redraw && _frame_cnt != 0; - if (animator.active() || redraw_pending) - timer.schedule(); + if (_animator.active() || redraw_pending) + _timer.schedule(); } @@ -285,21 +291,6 @@ void Menu_view::Main::handle_frame_timer(unsigned) */ extern "C" void _sigprocmask() { } -int main(int argc, char **argv) -{ - static Genode::Signal_receiver sig_rec; - static Menu_view::Main application(sig_rec); +void Libc::Component::construct(Genode::Env &env) { static Menu_view::Main main(env); } - /* process incoming signals */ - for (;;) { - using namespace Genode; - - Signal sig = sig_rec.wait_for_signal(); - Signal_dispatcher_base *dispatcher = - dynamic_cast(sig.context()); - - if (dispatcher) - dispatcher->dispatch(sig.num()); - } -} diff --git a/repos/gems/src/app/menu_view/style_database.h b/repos/gems/src/app/menu_view/style_database.h index 018f54e0a..463c13e35 100644 --- a/repos/gems/src/app/menu_view/style_database.h +++ b/repos/gems/src/app/menu_view/style_database.h @@ -92,31 +92,13 @@ class Menu_view::Style_database /* * Assemble path name 'styles//