qt5: handle Genode signals as Qt signals in QPA plugin

Fixes #3688
This commit is contained in:
Christian Prochaska 2020-03-10 17:51:15 +01:00 committed by Norman Feske
parent 8788f13e11
commit 8535688605
5 changed files with 44 additions and 4 deletions

View File

@ -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:

View File

@ -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

View File

@ -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);
}

View File

@ -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<QMimeData> _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);

View File

@ -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<Command::To_front>(_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()