From 72801975cdf1c99480774171c664e5f4ae61b123 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 5 Jan 2021 14:07:58 +0100 Subject: [PATCH] nitpicker: defer hover changed while dragging When holding at least one key or button, the hovering should never change. In the previous version, this invariant was not enforced, but the symptoms for eventual inconsistencies were masked by two checkes: one when generating the hover report, and one when submitting the leave event. This patch enforces the invariant by suppressing any change of 'User_state::_hovered' while in dragged state. Fixes #3973 --- repos/os/src/server/nitpicker/main.cc | 2 +- repos/os/src/server/nitpicker/user_state.cc | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/repos/os/src/server/nitpicker/main.cc b/repos/os/src/server/nitpicker/main.cc index 2aa78cfdb1..da09427d6b 100644 --- a/repos/os/src/server/nitpicker/main.cc +++ b/repos/os/src/server/nitpicker/main.cc @@ -705,7 +705,7 @@ void Nitpicker::Main::handle_input_events(User_state::Input_batch batch) } /* report hover changes */ - if (_hover_reporter.enabled() && !result.key_pressed + if (_hover_reporter.enabled() && (result.hover_changed || (old_motion_activity != _motion_activity))) { Reporter::Xml_generator xml(_hover_reporter, [&] () { _user_state.report_hovered_view_owner(xml, _motion_activity); }); diff --git a/repos/os/src/server/nitpicker/user_state.cc b/repos/os/src/server/nitpicker/user_state.cc index f681036887..4e4e6145f4 100644 --- a/repos/os/src/server/nitpicker/user_state.cc +++ b/repos/os/src/server/nitpicker/user_state.cc @@ -419,6 +419,10 @@ User_state::Handle_forget_result User_state::forget(View_owner const &owner) User_state::Update_hover_result User_state::update_hover() { + /* no hover changes while dragging */ + if (_key_pressed()) + return { .hover_changed = false }; + View_owner * const old_hovered = _hovered; View const * const pointed_view = _view_stack.find_view(_pointer_pos); @@ -432,7 +436,7 @@ User_state::Update_hover_result User_state::update_hover() if (old_hovered) old_hovered->submit_input_event(Hover_leave()); - if (_hovered && _key_cnt == 0) + if (_hovered) _hovered->submit_input_event(Absolute_motion{_pointer_pos.x(), _pointer_pos.y()}); }