diff --git a/repos/os/src/server/nitpicker/main.cc b/repos/os/src/server/nitpicker/main.cc index a977694be7..48c5f53de1 100644 --- a/repos/os/src/server/nitpicker/main.cc +++ b/repos/os/src/server/nitpicker/main.cc @@ -80,6 +80,7 @@ class Nitpicker::Root : public Root_component, View_component &_builtin_background; Framebuffer::Session &_framebuffer; Reporter &_focus_reporter; + Reporter &_hover_reporter; Focus_updater &_focus_updater; protected: @@ -132,9 +133,21 @@ class Nitpicker::Root : public Root_component, _global_keys.apply_config(_config.xml(), _session_list); session->destroy_all_views(); - _user_state.forget(*session); + User_state::Handle_forget_result result = _user_state.forget(*session); Genode::destroy(md_alloc(), session); + + /* report hover changes */ + if (_hover_reporter.enabled() && result.hover_changed) { + Reporter::Xml_generator xml(_hover_reporter, [&] () { + _user_state.report_hovered_view_owner(xml, false); }); + } + + /* report focus changes */ + if (_focus_reporter.enabled() && result.focus_changed) { + Reporter::Xml_generator xml(_focus_reporter, [&] () { + _user_state.report_focused_view_owner(xml, false); }); + } } public: @@ -148,7 +161,7 @@ class Nitpicker::Root : public Root_component, User_state &user_state, View_component &pointer_origin, View_component &builtin_background, Allocator &md_alloc, Framebuffer::Session &framebuffer, Reporter &focus_reporter, - Focus_updater &focus_updater) + Reporter &hover_reporter, Focus_updater &focus_updater) : Root_component(&env.ep().rpc_ep(), &md_alloc), _env(env), _config(config), _session_list(session_list), @@ -157,7 +170,8 @@ class Nitpicker::Root : public Root_component, _pointer_origin(pointer_origin), _builtin_background(builtin_background), _framebuffer(framebuffer), - _focus_reporter(focus_reporter), _focus_updater(focus_updater) + _focus_reporter(focus_reporter), _hover_reporter(hover_reporter), + _focus_updater(focus_updater) { } @@ -291,7 +305,7 @@ struct Nitpicker::Main : Focus_updater Root _root { _env, _config_rom, _session_list, *_domain_registry, _global_keys, _view_stack, _font, _user_state, _pointer_origin, _builtin_background, _sliced_heap, _framebuffer, - _focus_reporter, *this }; + _focus_reporter, _hover_reporter, *this }; /** * Focus_updater interface diff --git a/repos/os/src/server/nitpicker/user_state.cc b/repos/os/src/server/nitpicker/user_state.cc index 9a6814e1eb..0ab78d9fa1 100644 --- a/repos/os/src/server/nitpicker/user_state.cc +++ b/repos/os/src/server/nitpicker/user_state.cc @@ -386,11 +386,13 @@ void User_state::report_last_clicked_view_owner(Xml_generator &xml) const } -void User_state::forget(View_owner const &owner) +User_state::Handle_forget_result User_state::forget(View_owner const &owner) { _focus.forget(owner); bool const need_to_update_all_views = (&owner == _focused); + bool const hover_changed = &owner == _hovered; + bool const focus_changed = &owner == _focused; if (&owner == _focused) _focused = nullptr; if (&owner == _next_focused) _next_focused = nullptr; @@ -406,6 +408,11 @@ void User_state::forget(View_owner const &owner) if (need_to_update_all_views) _view_stack.update_all_views(); + + return { + .hover_changed = hover_changed, + .focus_changed = focus_changed, + }; } diff --git a/repos/os/src/server/nitpicker/user_state.h b/repos/os/src/server/nitpicker/user_state.h index 84122cb021..ecb33a98b7 100644 --- a/repos/os/src/server/nitpicker/user_state.h +++ b/repos/os/src/server/nitpicker/user_state.h @@ -193,7 +193,12 @@ class Nitpicker::User_state /** * Discard all references to specified view owner */ - void forget(View_owner const &); + struct Handle_forget_result + { + bool const hover_changed; + bool const focus_changed; + }; + Handle_forget_result forget(View_owner const &); void report_keystate(Xml_generator &) const; void report_pointer_position(Xml_generator &) const;