nitpicker: report focus/hover when owner vanishes

Fixes #2974
This commit is contained in:
Alexander Boettcher 2018-09-10 23:05:45 +02:00 committed by Christian Helmuth
parent 76e9645787
commit 6a496087ba
3 changed files with 32 additions and 6 deletions

View File

@ -80,6 +80,7 @@ class Nitpicker::Root : public Root_component<Session_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<Session_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<Session_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<Session_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<Session_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<PT> _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

View File

@ -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,
};
}

View File

@ -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;