From d3d6b643f1ed6630d7b77da446b80bb3e4ffcec9 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Mon, 18 Feb 2019 16:02:29 +0100 Subject: [PATCH] wm: shape report interception mechanism This patch simplifies the propagation of pointer shapes from window-manager clients to the pointer. The "shape" report is routed to the wm server, which, in turn, reports it to the pointer. This way, the pointer can easily correlate the label of the application's "shape" report with the label of the application's Nitpicker session. The formerly used manual rewriting of the "shape" label is not needed anymore. Since the wm server provides a "Report" service now, its declaration must cover "Report" in addition to "Nitpicker" to avoid runtime error messages. Vice versa, the wm is now expected to request "shape" reports, which should be routed to the pointer (using the 'label_last' routing attribute). Fixes #3165 --- repos/gems/recipes/raw/motif_wm/wm.config | 8 +- repos/gems/recipes/raw/wm/wm.config | 5 +- repos/gems/run/launcher.run | 8 +- repos/gems/run/mixer_gui_qt_test.run | 4 +- repos/gems/run/sculpt/launcher/arora | 2 +- repos/gems/run/sculpt/launcher/config_editor | 4 +- repos/gems/run/sculpt/launcher/firefox@vbox | 2 +- repos/gems/run/sculpt/launcher/vm | 2 +- repos/gems/run/sculpt/launcher/wm | 1 + repos/gems/run/sculpt/leitzentrale.config | 2 +- repos/gems/run/tiled_wm.run | 20 +--- repos/gems/run/wm.run | 2 +- repos/gems/src/server/wm/main.cc | 3 + repos/gems/src/server/wm/report_forwarder.h | 102 +++++++++++++++++++ repos/libports/run/qt5_common.inc | 3 +- repos/libports/run/qt5_textedit.run | 8 +- 16 files changed, 139 insertions(+), 37 deletions(-) create mode 100644 repos/gems/src/server/wm/report_forwarder.h diff --git a/repos/gems/recipes/raw/motif_wm/wm.config b/repos/gems/recipes/raw/motif_wm/wm.config index 0ec71f3c7..deca1999d 100644 --- a/repos/gems/recipes/raw/motif_wm/wm.config +++ b/repos/gems/recipes/raw/motif_wm/wm.config @@ -6,6 +6,7 @@ + @@ -18,6 +19,10 @@ + + + + @@ -40,7 +45,7 @@ - + @@ -50,6 +55,7 @@ + diff --git a/repos/gems/recipes/raw/wm/wm.config b/repos/gems/recipes/raw/wm/wm.config index 4e8fa62bb..01641e340 100644 --- a/repos/gems/recipes/raw/wm/wm.config +++ b/repos/gems/recipes/raw/wm/wm.config @@ -6,6 +6,7 @@ + @@ -48,6 +49,7 @@ + @@ -72,7 +74,7 @@ - + @@ -82,6 +84,7 @@ + diff --git a/repos/gems/run/launcher.run b/repos/gems/run/launcher.run index cfe5ef73a..385d08146 100644 --- a/repos/gems/run/launcher.run +++ b/repos/gems/run/launcher.run @@ -105,6 +105,7 @@ install_config { + @@ -142,7 +143,7 @@ install_config { - + @@ -152,8 +153,9 @@ install_config { - - + + + diff --git a/repos/gems/run/mixer_gui_qt_test.run b/repos/gems/run/mixer_gui_qt_test.run index 76134c6f5..cd1a4bf1b 100644 --- a/repos/gems/run/mixer_gui_qt_test.run +++ b/repos/gems/run/mixer_gui_qt_test.run @@ -79,9 +79,7 @@ append config { - - - + diff --git a/repos/gems/run/sculpt/launcher/arora b/repos/gems/run/sculpt/launcher/arora index 32a1737f6..810e8aaaf 100644 --- a/repos/gems/run/sculpt/launcher/arora +++ b/repos/gems/run/sculpt/launcher/arora @@ -2,7 +2,7 @@ - + diff --git a/repos/gems/run/sculpt/launcher/config_editor b/repos/gems/run/sculpt/launcher/config_editor index 0b88be586..d83a2d504 100644 --- a/repos/gems/run/sculpt/launcher/config_editor +++ b/repos/gems/run/sculpt/launcher/config_editor @@ -1,7 +1,7 @@ - - + + diff --git a/repos/gems/run/sculpt/launcher/firefox@vbox b/repos/gems/run/sculpt/launcher/firefox@vbox index b06c9c160..74548bd98 100644 --- a/repos/gems/run/sculpt/launcher/firefox@vbox +++ b/repos/gems/run/sculpt/launcher/firefox@vbox @@ -3,7 +3,7 @@ - + diff --git a/repos/gems/run/sculpt/launcher/vm b/repos/gems/run/sculpt/launcher/vm index 5cd90f615..ce6236898 100644 --- a/repos/gems/run/sculpt/launcher/vm +++ b/repos/gems/run/sculpt/launcher/vm @@ -4,7 +4,7 @@ - + diff --git a/repos/gems/run/sculpt/launcher/wm b/repos/gems/run/sculpt/launcher/wm index 9973164ca..62b341fe5 100644 --- a/repos/gems/run/sculpt/launcher/wm +++ b/repos/gems/run/sculpt/launcher/wm @@ -2,5 +2,6 @@ + diff --git a/repos/gems/run/sculpt/leitzentrale.config b/repos/gems/run/sculpt/leitzentrale.config index fc16cb0d7..a56f75269 100644 --- a/repos/gems/run/sculpt/leitzentrale.config +++ b/repos/gems/run/sculpt/leitzentrale.config @@ -107,7 +107,7 @@ - + diff --git a/repos/gems/run/tiled_wm.run b/repos/gems/run/tiled_wm.run index 4730f9728..9e5a6a743 100644 --- a/repos/gems/run/tiled_wm.run +++ b/repos/gems/run/tiled_wm.run @@ -122,9 +122,7 @@ append config { - - - + @@ -148,9 +146,7 @@ append config { - - - + @@ -171,9 +167,7 @@ append config { - - - + @@ -194,9 +188,7 @@ append config { - - - + @@ -216,9 +208,7 @@ append config { - - - + diff --git a/repos/gems/run/wm.run b/repos/gems/run/wm.run index 1de182d0c..0ccfe8203 100644 --- a/repos/gems/run/wm.run +++ b/repos/gems/run/wm.run @@ -74,7 +74,7 @@ install_config { - + diff --git a/repos/gems/src/server/wm/main.cc b/repos/gems/src/server/wm/main.cc index ba7be47d9..b18c2416f 100644 --- a/repos/gems/src/server/wm/main.cc +++ b/repos/gems/src/server/wm/main.cc @@ -22,6 +22,7 @@ /* local includes */ #include +#include namespace Wm { @@ -110,6 +111,8 @@ struct Wm::Main Genode::Signal_handler
resize_request_handler = { env.ep(), *this, &Main::handle_resize_request_update }; + Report_forwarder _report_forwarder { env, heap }; + Main(Genode::Env &env) : env(env) { pointer_reporter.enabled(true); diff --git a/repos/gems/src/server/wm/report_forwarder.h b/repos/gems/src/server/wm/report_forwarder.h new file mode 100644 index 000000000..ce57de6a0 --- /dev/null +++ b/repos/gems/src/server/wm/report_forwarder.h @@ -0,0 +1,102 @@ +/* + * \brief Report service for intercepting shape reports + * \author Norman Feske + * \date 2019-02-18 + * + * This report service has the sole purpose of applying the same labeling + * policy to an application's shape report as done for the application's + * 'Nitpicker' session. This consistency is needed by the pointer to correlate + * the currently hovered nitpicker session with the reported shapes. + */ + +/* + * Copyright (C) 2015-2019 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _REPORT_FORWARDER_H_ +#define _REPORT_FORWARDER_H_ + +/* Genode includes */ +#include +#include + +namespace Wm { struct Report_forwarder; } + + +struct Wm::Report_forwarder +{ + struct Session : Genode::Rpc_object + { + Genode::Env &_env; + Report::Connection _connection; + + Session(Genode::Env &env, Genode::Session_label const &label) + : _env(env), _connection(env, label.string()) + { _env.ep().manage(*this); } + + ~Session() { _env.ep().dissolve(*this); } + + void upgrade(Genode::Session::Resources const &resources) + { + _connection.upgrade(resources); + } + + + /******************************* + ** Report::Session interface ** + *******************************/ + + Genode::Dataspace_capability dataspace() override + { + return _connection.dataspace(); + } + + void submit(Genode::size_t length) override + { + _connection.submit(length); + } + + void response_sigh(Genode::Signal_context_capability sigh) override + { + _connection.response_sigh(sigh); + } + + Genode::size_t obtain_response() override + { + return _connection.obtain_response(); + } + }; + + struct Root : Genode::Root_component + { + Genode::Env &_env; + Genode::Allocator &_alloc; + + Session *_create_session(char const *args) override + { + return new (md_alloc()) Session(_env, Genode::label_from_args(args)); + } + + void _upgrade_session(Session *session, const char *args) override + { + session->upgrade(Genode::session_resources_from_args(args)); + } + + Root(Genode::Env &env, Genode::Allocator &alloc) + : + Genode::Root_component(env.ep(), alloc), + _env(env), _alloc(alloc) + { + _env.parent().announce(env.ep().manage(*this)); + } + + } _root; + + Report_forwarder(Genode::Env &env, Genode::Allocator &alloc) + : _root(env, alloc) { } +}; + +#endif /* _REPORT_FORWARDER_H_ */ diff --git a/repos/libports/run/qt5_common.inc b/repos/libports/run/qt5_common.inc index d5503ee41..9f20514aa 100644 --- a/repos/libports/run/qt5_common.inc +++ b/repos/libports/run/qt5_common.inc @@ -156,7 +156,7 @@ proc qt5_start_nodes { feature_arg } { - + @@ -166,6 +166,7 @@ proc qt5_start_nodes { feature_arg } { + diff --git a/repos/libports/run/qt5_textedit.run b/repos/libports/run/qt5_textedit.run index 35a0861f4..0251d5370 100644 --- a/repos/libports/run/qt5_textedit.run +++ b/repos/libports/run/qt5_textedit.run @@ -96,9 +96,7 @@ append config { - - - + @@ -119,9 +117,7 @@ append config { - - - +