From 1088035f8ef45dcf34c635a898aad95d780d3342 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 12 Oct 2021 15:53:51 +0200 Subject: [PATCH] wm: defer pointer report update This patch ensures that the pointer report is updated not before all input events are handled. The change does not solve any observed practical issue but the potential problem was spotted while reviewing the code. Issue #4176 --- repos/gems/src/server/wm/main.cc | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/repos/gems/src/server/wm/main.cc b/repos/gems/src/server/wm/main.cc index 36a1806be7..43b456178d 100644 --- a/repos/gems/src/server/wm/main.cc +++ b/repos/gems/src/server/wm/main.cc @@ -112,10 +112,10 @@ struct Wm::Main : Pointer::Tracker Report_forwarder _report_forwarder { env, heap }; Rom_forwarder _rom_forwarder { env, heap }; - /** - * Pointer::Tracker interface - */ - void update_pointer_report() override + Genode::Signal_handler
_update_pointer_report_handler = + { env.ep(), *this, &Main::_handle_update_pointer_report }; + + void _handle_update_pointer_report() { Pointer::Position pos = gui_root.last_observed_pointer_pos(); @@ -128,6 +128,21 @@ struct Wm::Main : Pointer::Tracker }); } + /** + * Pointer::Tracker interface + * + * This method is called during the event handling, which may affect + * multiple 'Pointer::State' instances. Hence, at call time, not all + * pointer states may be up to date. To ensure the consistency of all + * pointer states when creating the report, we merely schedule a call + * of '_handle_update_pointer_report' that is executed after the event + * handling is finished. + */ + void update_pointer_report() override + { + _update_pointer_report_handler.local_submit(); + } + Main(Genode::Env &env) : env(env) { pointer_reporter.enabled(true);