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 0ec71f3c74..deca1999da 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 4e8fa62bbb..01641e340d 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 cfe5ef73a7..385d081460 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 76134c6f5b..cd1a4bf1b0 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 32a1737f6f..810e8aaaf1 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 0b88be5864..d83a2d504f 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 b06c9c1601..74548bd989 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 5cd90f6156..ce6236898b 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 9973164ca5..62b341fe5a 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 fc16cb0d7c..a56f752699 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 4730f97285..9e5a6a7434 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 1de182d0ca..0ccfe8203c 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 ba7be47d9c..b18c2416f5 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 0000000000..ce57de6a09 --- /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 d5503ee41f..9f20514aaa 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 35a0861f42..0251d53707 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 { - - - +