From e72915c13e4d271b646ed324e13e8dc87fbe746f Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 10 Dec 2024 15:02:38 +0100 Subject: [PATCH] nitpicker: send pointer pos to global key handler To enable a global key handler to implement motion gestures while a global key is held, it needs to know the current pointer position at the time when the global key sequence starts. This is prerequisite for the window layouter's ability to drag windows by clicking anywhere within the window while holding a global key. Issue #5403 --- repos/os/src/server/nitpicker/user_state.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/repos/os/src/server/nitpicker/user_state.cc b/repos/os/src/server/nitpicker/user_state.cc index 1c3b85604a..c378f0bfb3 100644 --- a/repos/os/src/server/nitpicker/user_state.cc +++ b/repos/os/src/server/nitpicker/user_state.cc @@ -234,8 +234,17 @@ void User_state::_handle_input_event(Input::Event ev) global_receiver = _global_keys.global_receiver(keycode); if (global_receiver) { + bool const orig_global_key_sequence = _global_key_sequence; _global_key_sequence = true; _input_receiver = global_receiver; + + /* deliver current pointer position at start of key sequence */ + if (orig_global_key_sequence != _global_key_sequence) + _pointer.with_result( + [&] (Point at) { + Absolute_motion motion { at.x, at.y }; + _input_receiver->submit_input_event(motion); }, + [&] (Nowhere) { }); } /* @@ -310,8 +319,9 @@ void User_state::_handle_input_event(Input::Event ev) update_hover(); - if (_drag && _input_receiver && (_input_receiver != _hovered)) - _input_receiver->submit_input_event(Hover_leave()); + if (_drag || _global_key_sequence) + if (_input_receiver && (_input_receiver != _hovered)) + _input_receiver->submit_input_event(Hover_leave()); _drag = false;