diff --git a/repos/gems/src/server/wm/decorator_gui.h b/repos/gems/src/server/wm/decorator_gui.h index 7020efd52e..d9a7b36346 100644 --- a/repos/gems/src/server/wm/decorator_gui.h +++ b/repos/gems/src/server/wm/decorator_gui.h @@ -26,20 +26,9 @@ #include #include -namespace Wm { class Main; - using Genode::Allocator; - using Genode::Arg_string; - using Genode::Object_pool; - using Genode::Attached_dataspace; - using Genode::Attached_ram_dataspace; - using Genode::Signal_handler; - using Genode::Reporter; - using Genode::Interface; -} - - namespace Wm { + class Main; struct Decorator_gui_session; struct Decorator_content_callback; struct Decorator_content_registry; @@ -58,7 +47,7 @@ struct Wm::Decorator_content_callback : Interface }; -struct Wm::Decorator_gui_session : Genode::Session_object, +struct Wm::Decorator_gui_session : Session_object, private List::Element, private Upgradeable { @@ -81,11 +70,11 @@ struct Wm::Decorator_gui_session : Genode::Session_object, Gui::View_ids _content_view_ids { }; - Genode::Env &_env; + Env &_env; - Genode::Constrained_ram_allocator _ram { _env.ram(), _ram_quota_guard(), _cap_quota_guard() }; + Constrained_ram_allocator _ram { _env.ram(), _ram_quota_guard(), _cap_quota_guard() }; - Genode::Sliced_heap _session_alloc { _ram, _env.rm() }; + Sliced_heap _session_alloc { _ram, _env.rm() }; Slab _content_view_ref_alloc { _session_alloc }; @@ -93,7 +82,7 @@ struct Wm::Decorator_gui_session : Genode::Session_object, Input::Session_client _input_session { _env.rm(), _real_gui.session.input() }; - Genode::Signal_context_capability _mode_sigh { }; + Signal_context_capability _mode_sigh { }; Attached_ram_dataspace _client_command_ds { _ram, _env.rm(), sizeof(Command_buffer) }; @@ -113,14 +102,14 @@ struct Wm::Decorator_gui_session : Genode::Session_object, Signal_handler _input_handler { _env.ep(), *this, &Decorator_gui_session::_handle_input }; - Window_registry::Id _win_id_from_title(Gui::Title const &title) + void _with_win_id_from_title(Gui::Title const &title, auto const &fn) { unsigned value = 0; - Genode::ascii_to(title.string(), value); - return { value }; + if (ascii_to(title.string(), value)) + fn(Window_registry::Id { value }); } - Decorator_gui_session(Genode::Env &env, + Decorator_gui_session(Env &env, Resources const &resources, Label const &label, Diag const &diag, @@ -239,8 +228,8 @@ struct Wm::Decorator_gui_session : Genode::Session_object, * as view title. For such views, we import the view from the * corresponding GUI cient instead of creating a new view. */ - Window_registry::Id const win_id = _win_id_from_title(attr.title); - if (win_id.valid()) { + bool out_of_ram = false, out_of_caps = false, associated = false; + _with_win_id_from_title(attr.title, [&] (Window_registry::Id win_id) { try { Content_view_ref &view_ref_ptr = *new (_content_view_ref_alloc) Content_view_ref(Window_registry::Id(win_id), _content_view_ids, id); @@ -251,21 +240,20 @@ struct Wm::Decorator_gui_session : Genode::Session_object, destroy(_content_view_ref_alloc, &view_ref_ptr); switch (result) { - case Associate_result::OUT_OF_RAM: return View_result::OUT_OF_RAM; - case Associate_result::OUT_OF_CAPS: return View_result::OUT_OF_CAPS; - case Associate_result::OK: return View_result::OK; + case Associate_result::OUT_OF_RAM: out_of_ram = true; break; + case Associate_result::OUT_OF_CAPS: out_of_caps = true; break; + case Associate_result::OK: associated = true; break; case Associate_result::INVALID: break; /* fall back to regular view */ }; } - catch (Genode::Out_of_ram) { - _starved_for_ram = true; - return View_result::OUT_OF_RAM; - } - catch (Genode::Out_of_caps) { - _starved_for_caps = true; - return View_result::OUT_OF_CAPS; - } - } + catch (Out_of_ram) { _starved_for_ram = out_of_ram = true; } + catch (Out_of_caps) { _starved_for_caps = out_of_caps = true; } + }); + + if (out_of_ram) return View_result::OUT_OF_RAM; + if (out_of_caps) return View_result::OUT_OF_CAPS; + if (associated) return View_result::OK; + return _real_gui.session.view(id, attr); } @@ -314,7 +302,7 @@ struct Wm::Decorator_gui_session : Genode::Session_object, _real_gui.session.release_view_id(view); } - Genode::Dataspace_capability command_dataspace() override + Dataspace_capability command_dataspace() override { return _client_command_ds.cap(); } @@ -332,7 +320,7 @@ struct Wm::Decorator_gui_session : Genode::Session_object, return _real_gui.session.mode(); } - void mode_sigh(Genode::Signal_context_capability sigh) override + void mode_sigh(Signal_context_capability sigh) override { /* * Remember signal-context capability to keep NOVA from revoking @@ -347,7 +335,7 @@ struct Wm::Decorator_gui_session : Genode::Session_object, return _real_gui.session.buffer(mode, use_alpha); } - void focus(Genode::Capability) override { } + void focus(Capability) override { } }; #endif /* _DECORATOR_GUI_H_ */ diff --git a/repos/gems/src/server/wm/direct_gui.h b/repos/gems/src/server/wm/direct_gui.h index 4a41519672..b28248e2df 100644 --- a/repos/gems/src/server/wm/direct_gui.h +++ b/repos/gems/src/server/wm/direct_gui.h @@ -21,14 +21,14 @@ namespace Wm { class Direct_gui_session; } -class Wm::Direct_gui_session : public Genode::Session_object +class Wm::Direct_gui_session : public Session_object { private: - Genode::Env &_env; + Env &_env; - Genode::Connection _connection { - _env, _label, Genode::Ram_quota { 36*1024 }, /* Args */ { } }; + Connection _connection { + _env, _label, Ram_quota { 36*1024 }, /* Args */ { } }; Gui::Session_client _session { _connection.cap() }; @@ -37,7 +37,7 @@ class Wm::Direct_gui_session : public Genode::Session_object public: - Direct_gui_session(Genode::Env &env, auto &&... args) + Direct_gui_session(Env &env, auto &&... args) : Session_object(env.ep(), args...), _env(env) @@ -94,7 +94,7 @@ class Wm::Direct_gui_session : public Genode::Session_object _session.release_view_id(view); } - Genode::Dataspace_capability command_dataspace() override + Dataspace_capability command_dataspace() override { return _session.command_dataspace(); } @@ -109,7 +109,7 @@ class Wm::Direct_gui_session : public Genode::Session_object return _session.mode(); } - void mode_sigh(Genode::Signal_context_capability sigh) override + void mode_sigh(Signal_context_capability sigh) override { _session.mode_sigh(sigh); } @@ -119,7 +119,7 @@ class Wm::Direct_gui_session : public Genode::Session_object return _session.buffer(mode, use_alpha); } - void focus(Genode::Capability session) override + void focus(Capability session) override { _session.focus(session); } diff --git a/repos/gems/src/server/wm/gui.h b/repos/gems/src/server/wm/gui.h index 290ce34e09..68e250652f 100644 --- a/repos/gems/src/server/wm/gui.h +++ b/repos/gems/src/server/wm/gui.h @@ -15,14 +15,6 @@ #define _GUI_H_ /* Genode includes */ -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -34,26 +26,6 @@ #include #include - -namespace Wm { - - using Genode::Rpc_object; - using Genode::List; - using Genode::Allocator; - using Genode::Affinity; - using Genode::static_cap_cast; - using Genode::Signal_handler; - using Genode::Weak_ptr; - using Genode::Locked_ptr; - using Genode::Tslab; - using Genode::Attached_ram_dataspace; - using Genode::Signal_context_capability; - using Genode::Signal_transmitter; - using Genode::Reporter; - using Genode::Capability; - using Genode::Interface; -} - namespace Wm { namespace Gui { using namespace ::Gui; @@ -66,10 +38,6 @@ namespace Wm { namespace Gui { class Session_control_fn; class Session_component; class Root; - - using Rect = Genode::Surface_base::Rect; - using Point = Genode::Surface_base::Point; - using Session_label = Genode::Session_label; } } @@ -98,13 +66,12 @@ struct Wm::Gui::Input_origin_changed_handler : Interface }; -class Wm::Gui::View : private Genode::Weak_object, - public Genode::Rpc_object< ::Gui::View> +class Wm::Gui::View : private Weak_object, public Rpc_object< ::Gui::View> { private: - friend class Genode::Weak_ptr; - friend class Genode::Locked_ptr; + friend class Weak_ptr; + friend class Locked_ptr; protected: @@ -197,8 +164,8 @@ class Wm::Gui::View : private Genode::Weak_object, _real_gui.session.destroy_view(_real_view.id()); } - using Genode::Weak_object::weak_ptr; - using Genode::Weak_object::lock_for_destruction; + using Weak_object::weak_ptr; + using Weak_object::lock_for_destruction; Point virtual_position() const { return _geometry.at; } @@ -254,7 +221,7 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme friend class List; - Window_registry::Id _win_id { }; + Window_registry::Create_result _win_id = Window_registry::Create_error::IDS_EXHAUSTED; Window_registry &_window_registry; @@ -283,6 +250,12 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme using Command = Gui::Session::Command; + void _with_optional_win_id(auto const &fn) const + { + _win_id.with_result([&] (Window_registry::Id id) { fn(id); }, + [&] (Window_registry::Create_error) { }); + } + public: Top_level_view(Real_gui &real_gui, @@ -298,8 +271,8 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme ~Top_level_view() { - if (_win_id.valid()) - _window_registry.destroy(_win_id); + _with_optional_win_id([&] (Window_registry::Id id) { + _window_registry.destroy(id); }); View::lock_for_destruction(); } @@ -317,16 +290,20 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme * defer the creation of the window ID until the time when the * initial geometry is known. */ - if (!_win_id.valid()) { - _win_id = _window_registry.create(); - _window_registry.title(_win_id, _window_title); - _window_registry.label(_win_id, _session_label); - _window_registry.has_alpha(_win_id, View::has_alpha()); - _window_registry.resizeable(_win_id, _resizeable); + if (!_win_id.ok()) { + _win_id = _window_registry.create({ + .title = _window_title, + .label = _session_label, + .area = geometry.area, + .alpha = { View::has_alpha() }, + .hidden = { }, + .resizeable = { _resizeable } + }); + } else { + _with_optional_win_id([&] (Window_registry::Id id) { + _window_registry.area(id, geometry.area); }); } - _window_registry.size(_win_id, geometry.area); - View::geometry(geometry); } @@ -338,11 +315,17 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme _window_title = title; - if (_win_id.valid()) - _window_registry.title(_win_id, _window_title); + _with_optional_win_id([&] (Window_registry::Id id) { + _window_registry.title(id, _window_title); }); } - bool has_win_id(Window_registry::Id id) const { return id == _win_id; } + bool has_win_id(Window_registry::Id id) const + { + bool result = false; + _with_optional_win_id([&] (Window_registry::Id this_id) { + result = (this_id == id); }); + return result; + } bool belongs_to_win_id(Window_registry::Id id) const override { @@ -366,14 +349,18 @@ class Wm::Gui::Top_level_view : public View, private List::Eleme View_capability content_view() { return real_view_cap(); } - void hidden(bool hidden) { _window_registry.hidden(_win_id, hidden); } + void hidden(bool hidden) + { + _with_optional_win_id([&] (Window_registry::Id id) { + _window_registry.hidden(id, hidden); }); + } void resizeable(bool resizeable) { _resizeable = resizeable; - if (_win_id.valid()) - _window_registry.resizeable(_win_id, resizeable); + _with_optional_win_id([&] (Window_registry::Id id) { + _window_registry.resizeable(id, resizeable); }); } }; @@ -530,12 +517,12 @@ class Wm::Gui::Session_component : public Session_object, } }; - Genode::Env &_env; + Env &_env; - Genode::Constrained_ram_allocator _ram { + Constrained_ram_allocator _ram { _env.ram(), _ram_quota_guard(), _cap_quota_guard() }; - Genode::Sliced_heap _session_alloc { _ram, _env.rm() }; + Sliced_heap _session_alloc { _ram, _env.rm() }; Real_gui _real_gui { _env, _label }; Window_registry &_window_registry; Slab _top_level_view_alloc { _session_alloc }; @@ -748,14 +735,14 @@ class Wm::Gui::Session_component : public Session_object, { _top_level_views.remove(&view); _dissolve_view_from_ep(view); - Genode::destroy(&_top_level_view_alloc, &view); + destroy(&_top_level_view_alloc, &view); } void _destroy_child_view(Child_view &view) { _child_views.remove(&view); _dissolve_view_from_ep(view); - Genode::destroy(&_child_view_alloc, &view); + destroy(&_child_view_alloc, &view); } void _execute_command(Command const &command) @@ -804,8 +791,8 @@ class Wm::Gui::Session_component : public Session_object, char sanitized_title[args.title.capacity()]; - Genode::copy_cstring(sanitized_title, command.title.title.string(), - sizeof(sanitized_title)); + copy_cstring(sanitized_title, command.title.title.string(), + sizeof(sanitized_title)); for (char *c = sanitized_title; *c; c++) if (*c == '"') @@ -825,7 +812,7 @@ class Wm::Gui::Session_component : public Session_object, public: - Session_component(Genode::Env &env, + Session_component(Env &env, Resources const &resources, Label const &label, Diag const diag, @@ -897,13 +884,13 @@ class Wm::Gui::Session_component : public Session_object, View_capability content_view(Window_registry::Id id) { for (Top_level_view *v = _top_level_views.first(); v; v = v->next()) - if (v->has_win_id(id.value)) + if (v->has_win_id(id)) return v->content_view(); return View_capability(); } - bool has_win_id(unsigned id) const + bool has_win_id(Window_registry::Id id) const { for (Top_level_view const *v = _top_level_views.first(); v; v = v->next()) if (v->has_win_id(id)) @@ -1146,7 +1133,7 @@ class Wm::Gui::Session_component : public Session_object, [&] { }); } - Genode::Dataspace_capability command_dataspace() override + Dataspace_capability command_dataspace() override { return _command_ds.cap(); } @@ -1185,7 +1172,7 @@ class Wm::Gui::Session_component : public Session_object, return real_mode; } - void mode_sigh(Genode::Signal_context_capability sigh) override + void mode_sigh(Signal_context_capability sigh) override { _mode_sigh = sigh; @@ -1218,11 +1205,11 @@ class Wm::Gui::Session_component : public Session_object, return result; } - void focus(Genode::Capability) override { } + void focus(Capability) override { } }; -class Wm::Gui::Root : public Genode::Rpc_object >, +class Wm::Gui::Root : public Rpc_object >, public Decorator_content_callback { private: @@ -1233,9 +1220,9 @@ class Wm::Gui::Root : public Genode::Rpc_object Root(Root const &); Root &operator = (Root const &); - Genode::Env &_env; + Env &_env; - Genode::Attached_rom_dataspace _config { _env, "config" }; + Attached_rom_dataspace _config { _env, "config" }; Sliced_heap _sliced_heap { _env.ram(), _env.rm() }; @@ -1243,10 +1230,6 @@ class Wm::Gui::Root : public Genode::Rpc_object Pointer::Tracker &_pointer_tracker; - Reporter &_focus_request_reporter; - - unsigned _focus_request_cnt = 0; - Window_registry &_window_registry; Input::Session_component _window_layouter_input { _env, _env.ram() }; @@ -1293,13 +1276,12 @@ class Wm::Gui::Root : public Genode::Rpc_object /** * Constructor */ - Root(Genode::Env &env, Window_registry &window_registry, - Pointer::Tracker &pointer_tracker, Reporter &focus_request_reporter, + Root(Env &env, Window_registry &window_registry, + Pointer::Tracker &pointer_tracker, Gui::Connection &focus_gui_session) : _env(env), _pointer_tracker(pointer_tracker), - _focus_request_reporter(focus_request_reporter), _window_registry(window_registry), _focus_gui_session(focus_gui_session) { @@ -1336,9 +1318,11 @@ class Wm::Gui::Root : public Genode::Rpc_object Genode::Session_capability session(Session_args const &args, Affinity const &) override { - Genode::Session::Label label = Genode::label_from_args(args.string()); - Genode::Session::Resources resources = Genode::session_resources_from_args(args.string()); - Genode::Session::Diag diag = Genode::session_diag_from_args(args.string()); + using Session = Genode::Session; + + Session::Label label = label_from_args(args.string()); + Session::Resources resources = session_resources_from_args(args.string()); + Session::Diag diag = session_diag_from_args(args.string()); enum Role { ROLE_DECORATOR, ROLE_LAYOUTER, ROLE_REGULAR, ROLE_DIRECT }; Role role = ROLE_REGULAR; @@ -1347,8 +1331,7 @@ class Wm::Gui::Root : public Genode::Rpc_object * Determine session policy */ try { - Genode::Xml_node policy = - Genode::Session_policy(label, _config.xml()); + Xml_node policy = Session_policy(label, _config.xml()); auto const value = policy.attribute_value("role", String<16>()); @@ -1441,7 +1424,7 @@ class Wm::Gui::Root : public Genode::Rpc_object auto lambda = [&] (Rpc_object_base *session) { if (!session) { - Genode::warning("session lookup failed"); + warning("session lookup failed"); return; } @@ -1468,7 +1451,7 @@ class Wm::Gui::Root : public Genode::Rpc_object void close(Genode::Session_capability session_cap) override { - Genode::Rpc_entrypoint &ep = _env.ep().rpc_ep(); + Rpc_entrypoint &ep = _env.ep().rpc_ep(); Session_component *regular_session = ep.apply(session_cap, [this] (Session_component *session) { @@ -1477,7 +1460,7 @@ class Wm::Gui::Root : public Genode::Rpc_object return session; }); if (regular_session) { - Genode::destroy(_sliced_heap, regular_session); + destroy(_sliced_heap, regular_session); return; } @@ -1486,7 +1469,7 @@ class Wm::Gui::Root : public Genode::Rpc_object return session; }); if (direct_session) { - Genode::destroy(_sliced_heap, direct_session); + destroy(_sliced_heap, direct_session); return; } @@ -1497,7 +1480,7 @@ class Wm::Gui::Root : public Genode::Rpc_object return session; }); if (decorator_session) { - Genode::destroy(_sliced_heap, decorator_session); + destroy(_sliced_heap, decorator_session); return; } @@ -1507,7 +1490,7 @@ class Wm::Gui::Root : public Genode::Rpc_object }; if (ep.apply(session_cap, layouter_lambda) == _layouter_session) { - Genode::destroy(_sliced_heap, _layouter_session); + destroy(_sliced_heap, _layouter_session); return; } } @@ -1530,8 +1513,8 @@ class Wm::Gui::Root : public Genode::Rpc_object * calling 's->content_view'. */ for (Session_component *s = _sessions.first(); s; s = s->next()) - if (s->has_win_id(id.value)) - return s->content_view(id.value); + if (s->has_win_id(id)) + return s->content_view(id); return View_capability(); } @@ -1572,16 +1555,16 @@ class Wm::Gui::Root : public Genode::Rpc_object s->content_geometry(id, rect); } - Capability lookup_gui_session(unsigned win_id) + void with_gui_session(Window_registry::Id id, auto const &fn) { for (Session_component *s = _sessions.first(); s; s = s->next()) - if (s->has_win_id(win_id)) - return s->session(); - - return { }; + if (s->has_win_id(id)) { + fn(s->session()); + return; + } } - void request_resize(unsigned win_id, Area size) + void request_resize(Window_registry::Id win_id, Area size) { for (Session_component *s = _sessions.first(); s; s = s->next()) if (s->has_win_id(win_id)) diff --git a/repos/gems/src/server/wm/layouter_gui.h b/repos/gems/src/server/wm/layouter_gui.h index e09cfb2160..2c42d9bb33 100644 --- a/repos/gems/src/server/wm/layouter_gui.h +++ b/repos/gems/src/server/wm/layouter_gui.h @@ -24,11 +24,8 @@ namespace Wm { } -struct Wm::Layouter_gui_session : Genode::Session_object +struct Wm::Layouter_gui_session : Session_object { - using View_capability = Gui::View_capability; - using View_id = Gui::View_id; - Input::Session_capability _input_session_cap; /* @@ -36,11 +33,11 @@ struct Wm::Layouter_gui_session : Genode::Session_object */ Gui::Connection _mode_sigh_gui; - Genode::Signal_context_capability _mode_sigh { }; + Signal_context_capability _mode_sigh { }; Attached_ram_dataspace _command_ds; - Layouter_gui_session(Genode::Env &env, + Layouter_gui_session(Env &env, Resources const &resources, Label const &label, Diag const &diag, @@ -66,31 +63,31 @@ struct Wm::Layouter_gui_session : Genode::Session_object return _input_session_cap; } - View_result view(View_id, View_attr const &) override + View_result view(Gui::View_id, View_attr const &) override { return View_result::OK; } - Child_view_result child_view(View_id, View_id, View_attr const &) override + Child_view_result child_view(Gui::View_id, Gui::View_id, View_attr const &) override { return Child_view_result::OK; } - void destroy_view(View_id) override { } + void destroy_view(Gui::View_id) override { } - Associate_result associate(View_id, View_capability) override + Associate_result associate(Gui::View_id, Gui::View_capability) override { return Associate_result::OK; } - View_capability_result view_capability(View_id) override + View_capability_result view_capability(Gui::View_id) override { - return View_capability(); + return Gui::View_capability(); } - void release_view_id(View_id) override { } + void release_view_id(Gui::View_id) override { } - Genode::Dataspace_capability command_dataspace() override + Dataspace_capability command_dataspace() override { return _command_ds.cap(); } @@ -99,7 +96,7 @@ struct Wm::Layouter_gui_session : Genode::Session_object Framebuffer::Mode mode() override { return _mode_sigh_gui.mode(); } - void mode_sigh(Genode::Signal_context_capability sigh) override + void mode_sigh(Signal_context_capability sigh) override { /* * Remember signal-context capability to keep NOVA from revoking @@ -112,7 +109,7 @@ struct Wm::Layouter_gui_session : Genode::Session_object Buffer_result buffer(Framebuffer::Mode, bool) override { return Buffer_result::OK; } - void focus(Genode::Capability) override { } + void focus(Capability) override { } }; #endif /* _LAYOUTER_GUI_H_ */ diff --git a/repos/gems/src/server/wm/main.cc b/repos/gems/src/server/wm/main.cc index 9518188310..6723cd073d 100644 --- a/repos/gems/src/server/wm/main.cc +++ b/repos/gems/src/server/wm/main.cc @@ -15,104 +15,79 @@ #include #include #include -#include -#include -#include -#include /* local includes */ #include #include #include -namespace Wm { - - class Main; - -} +namespace Wm { class Main; } struct Wm::Main : Pointer::Tracker { - Genode::Env &env; + Env &_env; - Genode::Heap heap { env.ram(), env.rm() }; + Heap _heap { _env.ram(), _env.rm() }; /* currently focused window, reported by the layouter */ - Attached_rom_dataspace focus_rom { env, "focus" }; + Attached_rom_dataspace _focus_rom { _env, "focus" }; /* resize requests, issued by the layouter */ - Attached_rom_dataspace resize_request_rom { env, "resize_request" }; + Attached_rom_dataspace _resize_request_rom { _env, "resize_request" }; /* pointer position to be consumed by the layouter */ - Reporter pointer_reporter = { env, "pointer" }; + Expanding_reporter _pointer_reporter { _env, "pointer", "pointer" }; /* list of present windows, to be consumed by the layouter */ - Reporter window_list_reporter = { env, "window_list" }; + Expanding_reporter _window_list_reporter { _env, "window_list", "window_list" }; - /* request to the layouter to set the focus */ - Reporter focus_request_reporter = { env, "focus_request" }; + Window_registry _window_registry { _heap, _window_list_reporter }; - Window_registry window_registry { heap, window_list_reporter }; + Gui::Connection _focus_gui_session { _env }; - Gui::Connection focus_gui_session { env }; + Gui::Root _gui_root { _env, _window_registry, *this, _focus_gui_session }; - Gui::Root gui_root { env, window_registry, - *this, focus_request_reporter, - focus_gui_session }; - - void handle_focus_update() + static void _with_win_id_from_xml(Xml_node const &window, auto const &fn) { - focus_rom.update(); - - focus_rom.xml().with_optional_sub_node("window", [&] (Xml_node const &window) { - - unsigned const win_id = window.attribute_value("id", 0u); - - if (win_id) { - try { - Gui::Session_capability session_cap = - gui_root.lookup_gui_session(win_id); - - focus_gui_session.focus(session_cap); - } catch (...) { } - } - }); + if (window.has_attribute("id")) + fn(Window_registry::Id { window.attribute_value("id", 0u) }); } - Genode::Signal_handler
focus_handler = { - env.ep(), *this, &Main::handle_focus_update }; - - void handle_resize_request_update() + void _handle_focus_update() { - resize_request_rom.update(); - - resize_request_rom.xml().for_each_sub_node("window", [&] (Xml_node window) { - - unsigned const - win_id = window.attribute_value("id", 0U), - width = window.attribute_value("width", 0U), - height = window.attribute_value("height", 0U); - - gui_root.request_resize(win_id, Area(width, height)); - }); + _focus_rom.update(); + _focus_rom.xml().with_optional_sub_node("window", [&] (Xml_node const &window) { + _with_win_id_from_xml(window, [&] (Window_registry::Id id) { + _gui_root.with_gui_session(id, [&] (Capability cap) { + _focus_gui_session.focus(cap); }); }); }); } - Genode::Signal_handler
resize_request_handler = - { env.ep(), *this, &Main::handle_resize_request_update }; + Signal_handler
_focus_handler { + _env.ep(), *this, &Main::_handle_focus_update }; - Report_forwarder _report_forwarder { env, heap }; - Rom_forwarder _rom_forwarder { env, heap }; + void _handle_resize_request_update() + { + _resize_request_rom.update(); + _resize_request_rom.xml().for_each_sub_node("window", [&] (Xml_node const &window) { + _with_win_id_from_xml(window, [&] (Window_registry::Id id) { + _gui_root.request_resize(id, Area::from_xml(window)); }); }); + } - Genode::Signal_handler
_update_pointer_report_handler = - { env.ep(), *this, &Main::_handle_update_pointer_report }; + Signal_handler
_resize_request_handler { + _env.ep(), *this, &Main::_handle_resize_request_update }; + + Report_forwarder _report_forwarder { _env, _heap }; + Rom_forwarder _rom_forwarder { _env, _heap }; + + Signal_handler
_update_pointer_report_handler { + _env.ep(), *this, &Main::_handle_update_pointer_report }; void _handle_update_pointer_report() { - Pointer::Position pos = gui_root.last_observed_pointer_pos(); + Pointer::Position const pos = _gui_root.last_observed_pointer_pos(); - Reporter::Xml_generator xml(pointer_reporter, [&] () - { + _pointer_reporter.generate([&] (Xml_generator &xml) { if (pos.valid) { xml.attribute("xpos", pos.value.x); xml.attribute("ypos", pos.value.y); @@ -135,28 +110,15 @@ struct Wm::Main : Pointer::Tracker _update_pointer_report_handler.local_submit(); } - Main(Genode::Env &env) : env(env) + Main(Env &env) : _env(env) { - pointer_reporter.enabled(true); - /* initially report an empty window list */ - window_list_reporter.enabled(true); - Genode::Reporter::Xml_generator xml(window_list_reporter, [&] () { }); + _window_list_reporter.generate([&] (Xml_generator &) { }); - focus_request_reporter.enabled(true); - - focus_rom.sigh(focus_handler); - resize_request_rom.sigh(resize_request_handler); + _focus_rom.sigh(_focus_handler); + _resize_request_rom.sigh(_resize_request_handler); } }; -/*************** - ** Component ** - ***************/ - -Genode::size_t Component::stack_size() { - return 16*1024*sizeof(long); } - -void Component::construct(Genode::Env &env) { - static Wm::Main desktop(env); } +void Component::construct(Genode::Env &env) { static Wm::Main desktop(env); } diff --git a/repos/gems/src/server/wm/pointer.h b/repos/gems/src/server/wm/pointer.h index fbff2b7b12..25a5c9efbc 100644 --- a/repos/gems/src/server/wm/pointer.h +++ b/repos/gems/src/server/wm/pointer.h @@ -14,7 +14,8 @@ #ifndef _POINTER_H_ #define _POINTER_H_ -#include +/* local includes */ +#include namespace Wm { struct Pointer; } @@ -28,13 +29,13 @@ struct Wm::Pointer }; - struct Tracker : Genode::Interface, Genode::Noncopyable + struct Tracker : Interface, Noncopyable { virtual void update_pointer_report() = 0; }; - class State : Genode::Noncopyable + class State : Noncopyable { private: diff --git a/repos/gems/src/server/wm/real_gui.h b/repos/gems/src/server/wm/real_gui.h index 0cdcb382e9..ec9643af50 100644 --- a/repos/gems/src/server/wm/real_gui.h +++ b/repos/gems/src/server/wm/real_gui.h @@ -17,7 +17,6 @@ /* Genode includes */ #include #include -#include namespace Wm { struct Real_gui; } @@ -26,31 +25,31 @@ struct Wm::Real_gui { private: - Genode::Env &_env; + Env &_env; public: - Genode::Session_label const &label; + Session_label const &label; using Command_buffer = Gui::Session::Command_buffer; - static constexpr Genode::size_t RAM_QUOTA = 36*1024; + static constexpr size_t RAM_QUOTA = 36*1024; public: - Real_gui(Genode::Env &env, Genode::Session_label const &label) + Real_gui(Env &env, Session_label const &label) : _env(env), label(label) { } - Genode::Connection connection { + Connection connection { _env, label, Genode::Ram_quota { RAM_QUOTA }, /* Args */ { } }; Gui::Session_client session { connection.cap() }; private: - Genode::Attached_dataspace _command_ds { _env.rm(), session.command_dataspace() }; + Attached_dataspace _command_ds { _env.rm(), session.command_dataspace() }; Command_buffer &_command_buffer { *_command_ds.local_addr() }; diff --git a/repos/gems/src/server/wm/report_forwarder.h b/repos/gems/src/server/wm/report_forwarder.h index ddf90d1471..796b731653 100644 --- a/repos/gems/src/server/wm/report_forwarder.h +++ b/repos/gems/src/server/wm/report_forwarder.h @@ -32,19 +32,17 @@ namespace Wm { struct Report_forwarder; } struct Wm::Report_forwarder { - struct Session : Genode::Rpc_object + struct Session : Session_object { - Genode::Env &_env; Report::Connection _connection; - Session(Genode::Env &env, Genode::Session_label const &label, - size_t buffer_size) - : _env(env), _connection(env, label.string(), buffer_size) - { _env.ep().manage(*this); } + Session(Env &env, size_t buffer_size, auto &&... args) + : + Session_object(env.ep(), args...), + _connection(env, label(), buffer_size) + { } - ~Session() { _env.ep().dissolve(*this); } - - void upgrade(Genode::Session::Resources const &resources) + void upgrade(Session::Resources const &resources) { _connection.upgrade(resources); } @@ -54,47 +52,49 @@ struct Wm::Report_forwarder ** Report::Session interface ** *******************************/ - Genode::Dataspace_capability dataspace() override + Dataspace_capability dataspace() override { return _connection.dataspace(); } - void submit(Genode::size_t length) override + void submit(size_t length) override { _connection.submit(length); } - void response_sigh(Genode::Signal_context_capability sigh) override + void response_sigh(Signal_context_capability sigh) override { _connection.response_sigh(sigh); } - Genode::size_t obtain_response() override + size_t obtain_response() override { return _connection.obtain_response(); } }; - struct Root : Genode::Root_component + struct Root : Root_component { - Genode::Env &_env; - Genode::Allocator &_alloc; + Env &_env; + Allocator &_alloc; Session *_create_session(char const *args) override { return new (md_alloc()) - Session(_env, Genode::label_from_args(args), - Arg_string::find_arg(args, "buffer_size").ulong_value(0)); + Session(_env, Arg_string::find_arg(args, "buffer_size").ulong_value(0), + session_resources_from_args(args), + session_label_from_args(args), + session_diag_from_args(args)); } void _upgrade_session(Session *session, const char *args) override { - session->upgrade(Genode::session_resources_from_args(args)); + session->upgrade(session_resources_from_args(args)); } - Root(Genode::Env &env, Genode::Allocator &alloc) + Root(Env &env, Allocator &alloc) : - Genode::Root_component(env.ep(), alloc), + Root_component(env.ep(), alloc), _env(env), _alloc(alloc) { _env.parent().announce(env.ep().manage(*this)); @@ -102,8 +102,7 @@ struct Wm::Report_forwarder } _root; - Report_forwarder(Genode::Env &env, Genode::Allocator &alloc) - : _root(env, alloc) { } + Report_forwarder(Env &env, Allocator &alloc) : _root(env, alloc) { } }; #endif /* _REPORT_FORWARDER_H_ */ diff --git a/repos/gems/src/server/wm/rom_forwarder.h b/repos/gems/src/server/wm/rom_forwarder.h index b73c7d8513..783dd3698f 100644 --- a/repos/gems/src/server/wm/rom_forwarder.h +++ b/repos/gems/src/server/wm/rom_forwarder.h @@ -27,18 +27,17 @@ namespace Wm { struct Rom_forwarder; } struct Wm::Rom_forwarder { - struct Session : Genode::Rpc_object + struct Session : Session_object { - Genode::Env &_env; - Genode::Rom_connection _connection; + Rom_connection _connection; - Session(Genode::Env &env, Genode::Session_label const &label) - : _env(env), _connection(env, label.string()) - { _env.ep().manage(*this); } + Session(Env &env, auto &&... args) + : + Session_object(env.ep(), args...), + _connection(env, label()) + { } - ~Session() { _env.ep().dissolve(*this); } - - void upgrade(Genode::Session::Resources const &resources) + void upgrade(Session::Resources const &resources) { _connection.upgrade(resources); } @@ -48,7 +47,7 @@ struct Wm::Rom_forwarder ** Rom_session interface ** ***************************/ - Genode::Rom_dataspace_capability dataspace() override + Rom_dataspace_capability dataspace() override { return _connection.dataspace(); } @@ -64,24 +63,26 @@ struct Wm::Rom_forwarder } }; - struct Root : Genode::Root_component + struct Root : Root_component { - Genode::Env &_env; - Genode::Allocator &_alloc; + Env &_env; + Allocator &_alloc; Session *_create_session(char const *args) override { - return new (md_alloc()) Session(_env, Genode::label_from_args(args)); + return new (md_alloc()) Session(_env, session_resources_from_args(args), + session_label_from_args(args), + session_diag_from_args(args)); } void _upgrade_session(Session *session, const char *args) override { - session->upgrade(Genode::session_resources_from_args(args)); + session->upgrade(session_resources_from_args(args)); } - Root(Genode::Env &env, Genode::Allocator &alloc) + Root(Env &env, Allocator &alloc) : - Genode::Root_component(env.ep(), alloc), + Root_component(env.ep(), alloc), _env(env), _alloc(alloc) { _env.parent().announce(env.ep().manage(*this)); @@ -89,8 +90,7 @@ struct Wm::Rom_forwarder } _root; - Rom_forwarder(Genode::Env &env, Genode::Allocator &alloc) - : _root(env, alloc) { } + Rom_forwarder(Env &env, Allocator &alloc) : _root(env, alloc) { } }; #endif /* _ROM_FORWARDER_H_ */ diff --git a/repos/gems/src/server/wm/types.h b/repos/gems/src/server/wm/types.h index 7f88379c23..4274a972d1 100644 --- a/repos/gems/src/server/wm/types.h +++ b/repos/gems/src/server/wm/types.h @@ -15,19 +15,25 @@ #define _TYPES_H_ /* Genode includes */ +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include namespace Wm { - using Genode::uint8_t; - using Genode::size_t; - using Genode::Rom_connection; - using Genode::Xml_node; - using Genode::Attached_rom_dataspace; - using Genode::Tslab; - using Genode::Cap_quota; - using Genode::Ram_quota; + using namespace Genode; + + using Area = Surface_base::Area; + using Point = Surface_base::Point; + using Rect = Surface_base::Rect; /* * Slab allocator that includes an initial block as member @@ -41,7 +47,7 @@ namespace Wm { : Tslab(block_alloc, Initial_slab_block::buf) { }; }; - struct Upgradeable : Genode::Noncopyable + struct Upgradeable : Noncopyable { bool _starved_for_ram = false, _starved_for_caps = false; diff --git a/repos/gems/src/server/wm/window_registry.h b/repos/gems/src/server/wm/window_registry.h index 3f62bd27c0..2b734d29be 100644 --- a/repos/gems/src/server/wm/window_registry.h +++ b/repos/gems/src/server/wm/window_registry.h @@ -16,102 +16,89 @@ /* Genode includes */ #include -#include -#include -#include -#include -#include +#include /* gems includes */ #include +/* local includes */ +#include + namespace Wm { class Window_registry; } -namespace Wm { - using Genode::Allocator; - using Genode::List; - using Genode::Xml_generator; - using Genode::Reporter; - - using Area = Genode::Surface_base::Area; - using Point = Genode::Surface_base::Point; - using Rect = Genode::Surface_base::Rect; -} - - class Wm::Window_registry { public: - struct Id - { - unsigned value; + class Window; - Id(unsigned value) : value(value) { } + using Windows = Id_space; + using Id = Windows::Id; - Id() /* invalid */ : value(0) { } + struct Alpha { bool value; }; + struct Hidden { bool value; }; + struct Resizeable { bool value; }; - bool operator == (Id const &other) const { return value == other.value; } - - bool valid() const { return value != 0; } - }; - - class Window : public List::Element + class Window : Noncopyable { public: - using Title = Gui::Title; - using Session_label = Genode::Session_label; - - enum Has_alpha { HAS_ALPHA, HAS_NO_ALPHA }; - - enum Hidden { HIDDEN, NOT_HIDDEN }; - - enum Resizeable { RESIZEABLE, NOT_RESIZEABLE }; - - private: - - Id const _id; - struct Attr { - Title title { }; - Session_label label { }; - Area size { }; - Has_alpha has_alpha = HAS_NO_ALPHA; - Hidden hidden = NOT_HIDDEN; - Resizeable resizeable = NOT_RESIZEABLE; + Gui::Title title; + Session_label label; + Area area; + Alpha alpha; + Hidden hidden; + Resizeable resizeable; bool operator == (Attr const &other) const { - return title == other.title - && label == other.label - && size == other.size - && has_alpha == other.has_alpha - && hidden == other.hidden - && resizeable == other.resizeable; + return title == other.title + && label == other.label + && area == other.area + && alpha.value == other.alpha.value + && hidden.value == other.hidden.value + && resizeable.value == other.resizeable.value; + } + + void gen_window_attr(Xml_generator &xml) const + { + xml.attribute("label", label); + xml.attribute("title", title); + xml.attribute("width", area.w); + xml.attribute("height", area.h); + + if (alpha.value) xml.attribute("has_alpha", "yes"); + if (hidden.value) xml.attribute("hidden", "yes"); + if (resizeable.value) xml.attribute("resizeable", "yes"); } }; - Attr _attr { }; + private: + + Windows::Element _id; + + Attr _attr; Attr mutable _flushed_attr { }; friend class Window_registry; - Window(Id id) : _id(id) { } + Window(Windows &windows, Id id, Attr const &attr) + : _id(*this, windows, id), _attr(attr) { } public: - Id id() const { return _id; } + Id id() const { return _id.id(); } /* * Accessors for setting attributes */ - void attr(Title const &title) { _attr.title = title; } + void attr(Gui::Title const &title) { _attr.title = title; } void attr(Session_label const &label) { _attr.label = label; } - void attr(Area size) { _attr.size = size; } - void attr(Has_alpha has_alpha) { _attr.has_alpha = has_alpha; } + void attr(Area area) { _attr.area = area; } + void attr(Alpha alpha) { _attr.alpha = alpha; } void attr(Hidden hidden) { _attr.hidden = hidden; } void attr(Resizeable resizeable) { _attr.resizeable = resizeable; } @@ -120,28 +107,17 @@ class Wm::Window_registry void generate_window_list_entry_xml(Xml_generator &xml) const { /* - * Skip windows that have no defined size, which happens - * between the creation of a new window and the first - * time when the window's properties are assigned. + * Skip windows that have no defined size, which may happen + * between the creation of a new window for a view w/o size + * and the first time when the top-level view's size is + * assigned. */ - if (!_attr.size.valid()) + if (!_attr.area.valid()) return; xml.node("window", [&] () { - xml.attribute("id", _id.value); - xml.attribute("label", _attr.label.string()); - xml.attribute("title", _attr.title.string()); - xml.attribute("width", _attr.size.w); - xml.attribute("height", _attr.size.h); - - if (_attr.has_alpha == HAS_ALPHA) - xml.attribute("has_alpha", "yes"); - - if (_attr.hidden == HIDDEN) - xml.attribute("hidden", "yes"); - - if (_attr.resizeable == RESIZEABLE) - xml.attribute("resizeable", "yes"); + xml.attribute("id", id().value); + _attr.gen_window_attr(xml); }); } @@ -151,61 +127,49 @@ class Wm::Window_registry bool _flushed() const { bool result = true; - for (Window const *w = _windows.first(); w; w = w->next()) - result &= w->flushed(); - + _windows.for_each([&] (Window const &w) { + result &= w.flushed(); }); return result; } private: - Allocator &_alloc; - Reporter &_window_list_reporter; + Allocator &_alloc; + Expanding_reporter &_window_list_reporter; static constexpr unsigned MAX_WINDOWS = 1024; - Genode::Bit_allocator _window_ids { }; + Bit_allocator _window_ids { }; unsigned _next_id = 0; /* used to alloc subsequent numbers */ - List _windows { }; + Windows _windows { }; - Window *_lookup(Id id) + void _with_window(Id id, auto const &fn, auto const &missing_fn) { - for (Window *w = _windows.first(); w; w = w->next()) - if (w->id() == id) - return w; - - return 0; + _windows.apply(id, fn, missing_fn); } void _report_updated_window_list_model() const { - Reporter::Xml_generator xml(_window_list_reporter, [&] () - { - for (Window const *w = _windows.first(); w; w = w->next()) { - w->generate_window_list_entry_xml(xml); - w->mark_as_flushed(); - } + _window_list_reporter.generate([&] (Xml_generator &xml) { + _windows.for_each([&] (Window const &w) { + w.generate_window_list_entry_xml(xml); + w.mark_as_flushed(); + }); }); } - template - void _set_attr(Id const id, ATTR const &value) + void _set_attr(Id const id, auto const &value) { - Window * const win = _lookup(id); - - if (!win) { - Genode::warning("lookup for window ID ", id.value, " failed"); - return; - } - - win->attr(value); + _with_window(id, + [&] (Window &window) { window.attr(value); }, + [&] { warning("lookup for window ID ", id.value, " failed"); }); } public: - Window_registry(Allocator &alloc, Reporter &window_list_reporter) + Window_registry(Allocator &alloc, Expanding_reporter &window_list_reporter) : _alloc(alloc), _window_list_reporter(window_list_reporter) { @@ -213,72 +177,60 @@ class Wm::Window_registry _window_ids.alloc(); } - Id create() + enum class Create_error { IDS_EXHAUSTED }; + using Create_result = Attempt; + + Create_result create(Window::Attr const &attr) { - auto alloc_id = [&] + auto alloc_id = [&] () -> Create_result { - for (;;) { + for (unsigned i = 0; i < MAX_WINDOWS; i++) { unsigned try_id = _next_id; _next_id = (_next_id + 1) % MAX_WINDOWS; try { _window_ids.alloc_addr(try_id); - return try_id; + return Id { try_id }; } catch (...) { } } + return Create_error::IDS_EXHAUSTED; }; - Window * const win = new (_alloc) Window(alloc_id()); + Create_result const result = alloc_id(); - _windows.insert(win); + result.with_result( + [&] (Id id) { + new (_alloc) Window(_windows, id, attr); + _report_updated_window_list_model(); + }, + [&] (Create_error) { } + ); - /* - * Even though we change the window-list model by adding a - * window, we don't call '_report_updated_window_list_model' here - * because the window does not have any useful properties before - * the 'size' function has been called. - * - * XXX should we pass the initial size as argument to this function? - */ - - return win->id(); + return result; } void destroy(Id id) { - Window * const win = _lookup(id); - if (!win) + Window *win_ptr = nullptr; + _with_window(id, [&] (Window &window) { win_ptr = &window; }, [&] { }); + + if (!win_ptr) return; - _windows.remove(win); + _window_ids.free(win_ptr->id().value); - _window_ids.free(win->id().value); - - Genode::destroy(&_alloc, win); + Genode::destroy(&_alloc, win_ptr); _report_updated_window_list_model(); } - void size(Id id, Area size) { _set_attr(id, size); } + void area (Id id, Area const area) { _set_attr(id, area); } + void title(Id id, Gui::Title const &title) { _set_attr(id, title); } + void label(Id id, Session_label const &label) { _set_attr(id, label); } - void title(Id id, Window::Title const &title) { _set_attr(id, title); } - - void label(Id id, Window::Session_label const &label) { _set_attr(id, label); } - - void has_alpha(Id id, bool has_alpha) - { - _set_attr(id, has_alpha ? Window::HAS_ALPHA : Window::HAS_NO_ALPHA); - } - - void hidden(Id id, bool hidden) - { - _set_attr(id, hidden ? Window::HIDDEN : Window::NOT_HIDDEN); - } - - void resizeable(Id id, bool resizeable) - { - _set_attr(id, resizeable ? Window::RESIZEABLE : Window::NOT_RESIZEABLE); - } + void alpha (Id id, bool value) { _set_attr(id, Alpha { value }); } + void hidden (Id id, bool value) { _set_attr(id, Hidden { value }); } + void resizeable(Id id, bool value) { _set_attr(id, Resizeable { value }); } void flush() {