summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/qwaylanddatadevice.cpp17
-rw-r--r--src/client/qwaylanddatadevice_p.h2
-rw-r--r--src/client/qwaylanddnd.cpp9
3 files changed, 18 insertions, 10 deletions
diff --git a/src/client/qwaylanddatadevice.cpp b/src/client/qwaylanddatadevice.cpp
index 6b2a408e..990f92ba 100644
--- a/src/client/qwaylanddatadevice.cpp
+++ b/src/client/qwaylanddatadevice.cpp
@@ -102,19 +102,22 @@ QWaylandDataOffer *QWaylandDataDevice::dragOffer() const
return m_dragOffer.data();
}
-void QWaylandDataDevice::startDrag(QMimeData *mimeData, QWaylandWindow *icon)
+bool QWaylandDataDevice::startDrag(QMimeData *mimeData, QWaylandWindow *icon)
{
- m_dragSource.reset(new QWaylandDataSource(m_display->dndSelectionHandler(), mimeData));
- connect(m_dragSource.data(), &QWaylandDataSource::cancelled, this, &QWaylandDataDevice::dragSourceCancelled);
-
QWaylandWindow *origin = m_display->currentInputDevice()->pointerFocus();
if (!origin)
origin = m_display->currentInputDevice()->touchFocus();
- if (origin)
- start_drag(m_dragSource->object(), origin->object(), icon->object(), m_display->currentInputDevice()->serial());
- else
+ if (!origin) {
qCDebug(lcQpaWayland) << "Couldn't start a drag because the origin window could not be found.";
+ return false;
+ }
+
+ m_dragSource.reset(new QWaylandDataSource(m_display->dndSelectionHandler(), mimeData));
+ connect(m_dragSource.data(), &QWaylandDataSource::cancelled, this, &QWaylandDataDevice::dragSourceCancelled);
+
+ start_drag(m_dragSource->object(), origin->object(), icon->object(), m_display->currentInputDevice()->serial());
+ return true;
}
void QWaylandDataDevice::cancelDrag()
diff --git a/src/client/qwaylanddatadevice_p.h b/src/client/qwaylanddatadevice_p.h
index 0a7f4253..16c3ad28 100644
--- a/src/client/qwaylanddatadevice_p.h
+++ b/src/client/qwaylanddatadevice_p.h
@@ -89,7 +89,7 @@ public:
#if QT_CONFIG(draganddrop)
QWaylandDataOffer *dragOffer() const;
- void startDrag(QMimeData *mimeData, QWaylandWindow *icon);
+ bool startDrag(QMimeData *mimeData, QWaylandWindow *icon);
void cancelDrag();
#endif
diff --git a/src/client/qwaylanddnd.cpp b/src/client/qwaylanddnd.cpp
index b01a9db3..6535aa16 100644
--- a/src/client/qwaylanddnd.cpp
+++ b/src/client/qwaylanddnd.cpp
@@ -66,8 +66,13 @@ void QWaylandDrag::startDrag()
{
QBasicDrag::startDrag();
QWaylandWindow *icon = static_cast<QWaylandWindow *>(shapedPixmapWindow()->handle());
- m_display->currentInputDevice()->dataDevice()->startDrag(drag()->mimeData(), icon);
- icon->addAttachOffset(-drag()->hotSpot());
+ if (m_display->currentInputDevice()->dataDevice()->startDrag(drag()->mimeData(), icon)) {
+ icon->addAttachOffset(-drag()->hotSpot());
+ } else {
+ // Cancelling immediately does not work, since the event loop for QDrag::exec is started
+ // after this function returns.
+ QMetaObject::invokeMethod(this, [this](){ cancelDrag(); }, Qt::QueuedConnection);
+ }
}
void QWaylandDrag::cancel()