From 8535688605de821c30a33951b4d520de1258d926 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Tue, 10 Mar 2020 17:51:15 +0100 Subject: [PATCH] qt5: handle Genode signals as Qt signals in QPA plugin Fixes #3688 --- .../qt5/qpa_nitpicker/qnitpickerplatformwindow.h | 13 +++++++++++++ repos/libports/lib/mk/qt5_qpa_nitpicker.mk | 1 + .../platforms/nitpicker/qgenodeclipboard.cpp | 6 +++++- .../platforms/nitpicker/qgenodeclipboard.h | 16 +++++++++++++++- .../nitpicker/qnitpickerplatformwindow.cpp | 12 ++++++++++-- 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h b/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h index 1d1593ecd..1a423904b 100644 --- a/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h +++ b/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h @@ -96,8 +96,21 @@ class QNitpickerPlatformWindow : public QObject, public QPlatformWindow QString _sanitize_label(QString label); + /* + * Genode signals are handled as Qt signals to avoid blocking in the + * Genode signal handler, which could cause nested signal handler + * execution. + */ + + private Q_SLOTS: + void _handle_input(); void _handle_mode_changed(); + + Q_SIGNALS: + + void _input(); + void _mode_changed(); public: diff --git a/repos/libports/lib/mk/qt5_qpa_nitpicker.mk b/repos/libports/lib/mk/qt5_qpa_nitpicker.mk index 21c6e8e5c..b2b6cbace 100644 --- a/repos/libports/lib/mk/qt5_qpa_nitpicker.mk +++ b/repos/libports/lib/mk/qt5_qpa_nitpicker.mk @@ -16,6 +16,7 @@ SRC_CC += main.cpp \ qnitpickerintegration.cpp \ qnitpickerplatformwindow.cpp \ qnitpickerwindowsurface.cpp \ + moc_qgenodeclipboard.cpp \ moc_qnitpickerplatformwindow.cpp \ moc_qnitpickerwindowsurface.cpp \ moc_qnitpickerintegrationplugin.cpp diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.cpp b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.cpp index f999a6264..304f2a241 100644 --- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.cpp +++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.cpp @@ -28,7 +28,7 @@ static constexpr bool verbose = false; QGenodeClipboard::QGenodeClipboard(Genode::Env &env) -: _clipboard_signal_handler(env.ep(), *this, &QGenodeClipboard::_handle_clipboard) +: _clipboard_signal_handler(env.ep(), *this, &QGenodeClipboard::_clipboard_changed) { try { @@ -52,6 +52,10 @@ QGenodeClipboard::QGenodeClipboard(Genode::Env &env) } } catch (...) { } + + connect(this, SIGNAL(_clipboard_changed()), + this, SLOT(_handle_clipboard()), + Qt::QueuedConnection); } diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.h b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.h index e3dc19a4a..3806a79b0 100644 --- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.h +++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.h @@ -28,8 +28,10 @@ QT_BEGIN_NAMESPACE -class QGenodeClipboard : public QPlatformClipboard +class QGenodeClipboard : public QObject, public QPlatformClipboard { + Q_OBJECT + private: Genode::Attached_rom_dataspace *_clipboard_ds = nullptr; @@ -41,8 +43,20 @@ class QGenodeClipboard : public QPlatformClipboard QMember _mimedata; + /* + * Genode signals are handled as Qt signals to avoid blocking in the + * Genode signal handler, which could cause nested signal handler + * execution. + */ + + private Q_SLOTS: + void _handle_clipboard(); + Q_SIGNALS: + + void _clipboard_changed(); + public: QGenodeClipboard(Genode::Env &env); diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp index 24f14c4a3..e5230ffee 100644 --- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp +++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp @@ -509,9 +509,9 @@ QNitpickerPlatformWindow::QNitpickerPlatformWindow(Genode::Env &env, QWindow *wi _decoration(!window->flags().testFlag(Qt::Popup)), _egl_surface(EGL_NO_SURFACE), _input_signal_handler(_env.ep(), *this, - &QNitpickerPlatformWindow::_handle_input), + &QNitpickerPlatformWindow::_input), _mode_changed_signal_handler(_env.ep(), *this, - &QNitpickerPlatformWindow::_handle_mode_changed), + &QNitpickerPlatformWindow::_mode_changed), _touch_device(_init_touch_device()) { if (qnpw_verbose) @@ -533,6 +533,14 @@ QNitpickerPlatformWindow::QNitpickerPlatformWindow(Genode::Env &env, QWindow *wi _nitpicker_session.enqueue(_view_handle); _nitpicker_session.execute(); } + + connect(this, SIGNAL(_input()), + this, SLOT(_handle_input()), + Qt::QueuedConnection); + + connect(this, SIGNAL(_mode_changed()), + this, SLOT(_handle_mode_changed()), + Qt::QueuedConnection); } QNitpickerPlatformWindow::~QNitpickerPlatformWindow()