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
This commit is contained in:
Norman Feske 2021-01-05 14:07:58 +01:00
parent 7266f29491
commit 72801975cd
2 changed files with 6 additions and 2 deletions

View File

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

View File

@ -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()});
}