From 3a2895af19def9010e841d09160f3fbc5cc4d0b4 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 28 Jan 2020 14:23:39 +0100 Subject: [PATCH] wm: reset pointer position on leave event The wm used to remember the last pointer position when observing a leave event. With such a stale pointer position, the wm would eventually wrongly create an artifical motion event when a supposedly hovered window changes its position (during an animated move). This can lead to the propagation of the stale pointer position to the wm client, which, in turn, may interpret the outdated position (e.g., the menu view would report a wrong hover state). This patch removes the stale state by resetting the '_pointer_pos' when observing a leave event. Fixes #3632 --- repos/gems/src/server/wm/nitpicker.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/repos/gems/src/server/wm/nitpicker.h b/repos/gems/src/server/wm/nitpicker.h index ff9cf3d6d4..713f85202e 100644 --- a/repos/gems/src/server/wm/nitpicker.h +++ b/repos/gems/src/server/wm/nitpicker.h @@ -612,8 +612,10 @@ class Wm::Nitpicker::Session_component : public Rpc_object, if (ev.release() && _key_cnt == 0) _click_handler.handle_enter(_pointer_pos); - if (ev.hover_leave()) + if (ev.hover_leave()) { + _pointer_pos = _initial_pointer_pos; _first_motion = true; + } /* submit event to the client */ _input_session.submit(_translate_event(ev, input_origin)); @@ -626,6 +628,9 @@ class Wm::Nitpicker::Session_component : public Rpc_object, */ void input_origin_changed() override { + if (_pointer_pos == _initial_pointer_pos) + return; + Point const pos = _pointer_pos + _input_origin(); _input_session.submit(Input::Absolute_motion { pos.x(), pos.y() });