From 73746a5a897297fe499e90e972bbbf736f0cfbba Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 23 Jun 2011 18:07:20 +0200 Subject: [PATCH] Have the selection offer global handled always without delay. In a previous attempt to solve the problem of selection offer globals arriving too early, the handling was delayed. This solved the issue of crashing but introduced a timing issue, because the offers (the mime types) will arrive immediately after the global and therefore will simply be ignored in case the delayed processing of the selection offer had not yet been done. The visibility of the problem depended on the implementation of the compositor, with recent changes to qt-compositor the issue is very visible. The patch solves the issue properly: The wayland clipboard instance is created right away, as early when needed, and the integration will simply pick up the already created instance. Change-Id: I75aaba4b0590c05cc0091bed7bb3593186c1188f Reviewed-on: http://codereview.qt.nokia.com/687 Reviewed-by: Qt Sanity Bot Reviewed-by: Paul Olav Tvete --- .../platforms/wayland/qwaylandclipboard.cpp | 10 ++++++++-- .../platforms/wayland/qwaylandclipboard.h | 5 ++++- .../platforms/wayland/qwaylanddisplay.cpp | 20 ++++--------------- .../platforms/wayland/qwaylanddisplay.h | 4 ---- .../platforms/wayland/qwaylandintegration.cpp | 5 +---- .../platforms/wayland/qwaylandintegration.h | 1 - 6 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.cpp b/src/plugins/platforms/wayland/qwaylandclipboard.cpp index b7f6ae535b1..1ef063fec15 100644 --- a/src/plugins/platforms/wayland/qwaylandclipboard.cpp +++ b/src/plugins/platforms/wayland/qwaylandclipboard.cpp @@ -50,7 +50,7 @@ #include #include -static QWaylandClipboard *clipboard; +static QWaylandClipboard *clipboard = 0; class QWaylandMimeData : public QInternalMimeData { @@ -162,10 +162,16 @@ void QWaylandSelection::cancelled(void *data, struct wl_selection *selection) delete static_cast(data); } +QWaylandClipboard *QWaylandClipboard::instance(QWaylandDisplay *display) +{ + if (!clipboard) + clipboard = new QWaylandClipboard(display); + return clipboard; +} + QWaylandClipboard::QWaylandClipboard(QWaylandDisplay *display) : mDisplay(display), mMimeDataIn(0), mOffer(0) { - clipboard = this; } QWaylandClipboard::~QWaylandClipboard() diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.h b/src/plugins/platforms/wayland/qwaylandclipboard.h index f45fb8da4cf..87294342d77 100644 --- a/src/plugins/platforms/wayland/qwaylandclipboard.h +++ b/src/plugins/platforms/wayland/qwaylandclipboard.h @@ -61,7 +61,8 @@ public slots: class QWaylandClipboard : public QPlatformClipboard { public: - QWaylandClipboard(QWaylandDisplay *display); + static QWaylandClipboard *instance(QWaylandDisplay *display); + ~QWaylandClipboard(); QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard); @@ -75,6 +76,8 @@ public: QVariant retrieveData(const QString &mimeType, QVariant::Type type) const; private: + QWaylandClipboard(QWaylandDisplay *display); + static void offer(void *data, struct wl_selection_offer *selection_offer, const char *type); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 93c98e3d7c3..69ec6adc0c6 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -126,9 +126,12 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = { QWaylandDisplay::shellHandleConfigure, }; +static QWaylandDisplay *display = 0; + QWaylandDisplay::QWaylandDisplay(void) : argb_visual(0), premultiplied_argb_visual(0), rgb_visual(0) { + display = this; qRegisterMetaType("uint32_t"); mDisplay = wl_display_connect(NULL); @@ -309,25 +312,10 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id, new QWaylandInputDevice(mDisplay, id); mInputDevices.append(inputDevice); } else if (interface == "wl_selection_offer") { - QPlatformIntegration *plat = QApplicationPrivate::platformIntegration(); - mSelectionOfferId = id; - if (plat) - handleSelectionOffer(id); - else - QMetaObject::invokeMethod(this, "handleSelectionOffer", - Qt::QueuedConnection, Q_ARG(uint32_t, id)); + QWaylandClipboard::instance(display)->createSelectionOffer(id); } } -void QWaylandDisplay::handleSelectionOffer(uint32_t id) -{ - if (mSelectionOfferId != id) - return; - QPlatformIntegration *plat = QApplicationPrivate::platformIntegration(); - QWaylandClipboard *clipboard = static_cast(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 87a3167a6dc..4dff24d086f 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -97,9 +97,6 @@ public slots: void blockingReadEvents(); void flushRequests(); -private slots: - void handleSelectionOffer(uint32_t id); - private: void waitForScreens(); void displayHandleGlobal(uint32_t id, @@ -118,7 +115,6 @@ private: bool mScreensInitialized; uint32_t mSocketMask; - uint32_t mSelectionOfferId; struct wl_visual *argb_visual, *premultiplied_argb_visual, *rgb_visual; diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 8257bca5573..5df71dc9360 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -65,7 +65,6 @@ QWaylandIntegration::QWaylandIntegration(bool useOpenGL) , mDisplay(new QWaylandDisplay()) , mUseOpenGL(useOpenGL) , mNativeInterface(new QWaylandNativeInterface) - , mClipboard(0) { } @@ -137,7 +136,5 @@ bool QWaylandIntegration::hasOpenGL() const QPlatformClipboard *QWaylandIntegration::clipboard() const { - if (!mClipboard) - mClipboard = new QWaylandClipboard(mDisplay); - return mClipboard; + return QWaylandClipboard::instance(mDisplay); } diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index c7dc89d928d..f617d9697b6 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -74,7 +74,6 @@ private: QWaylandDisplay *mDisplay; bool mUseOpenGL; QPlatformNativeInterface *mNativeInterface; - mutable QPlatformClipboard *mClipboard; }; QT_END_NAMESPACE