summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.cpp21
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.h4
2 files changed, 21 insertions, 4 deletions
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index 83516e9b4e..e6d39683fe 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -129,6 +129,8 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = {
QWaylandDisplay::QWaylandDisplay(void)
: argb_visual(0), premultiplied_argb_visual(0), rgb_visual(0)
{
+ qRegisterMetaType<uint32_t>("uint32_t");
+
mDisplay = wl_display_connect(NULL);
if (mDisplay == NULL) {
qErrnoWarning(errno, "Failed to create display");
@@ -147,8 +149,6 @@ QWaylandDisplay::QWaylandDisplay(void)
blockingReadEvents();
- qRegisterMetaType<uint32_t>("uint32_t");
-
#ifdef QT_WAYLAND_GL_SUPPORT
mEglIntegration->initialize();
#endif
@@ -291,11 +291,24 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id,
mInputDevices.append(inputDevice);
} else if (interface == "wl_selection_offer") {
QPlatformIntegration *plat = QApplicationPrivate::platformIntegration();
- QWaylandClipboard *clipboard = static_cast<QWaylandClipboard *>(plat->clipboard());
- clipboard->createSelectionOffer(id);
+ mSelectionOfferId = id;
+ if (plat)
+ handleSelectionOffer(id);
+ else
+ QMetaObject::invokeMethod(this, "handleSelectionOffer",
+ Qt::QueuedConnection, Q_ARG(uint32_t, id));
}
}
+void QWaylandDisplay::handleSelectionOffer(uint32_t id)
+{
+ if (mSelectionOfferId != id)
+ return;
+ QPlatformIntegration *plat = QApplicationPrivate::platformIntegration();
+ QWaylandClipboard *clipboard = static_cast<QWaylandClipboard *>(plat->clipboard());
+ clipboard->createSelectionOffer(id);
+}
+
void QWaylandDisplay::handleVisual(void *data,
struct wl_compositor *compositor,
uint32_t id, uint32_t token)
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index 765be62eb4..ff8c760557 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -97,6 +97,9 @@ public slots:
void blockingReadEvents();
void flushRequests();
+private slots:
+ void handleSelectionOffer(uint32_t id);
+
private:
void waitForScreens();
void displayHandleGlobal(uint32_t id,
@@ -115,6 +118,7 @@ private:
bool mScreensInitialized;
uint32_t mSocketMask;
+ uint32_t mSelectionOfferId;
struct wl_visual *argb_visual, *premultiplied_argb_visual, *rgb_visual;