diff --git a/src/protocols/core/DataDevice.cpp b/src/protocols/core/DataDevice.cpp index c1de8f83..86b372bf 100644 --- a/src/protocols/core/DataDevice.cpp +++ b/src/protocols/core/DataDevice.cpp @@ -13,13 +13,17 @@ CWLDataOfferResource::CWLDataOfferResource(SP resource_, SPsetDestroy([this](CWlDataOffer* r) { - if (!dead) + if (!dead && (recvd || accepted)) PROTO::data->completeDrag(); + else + PROTO::data->abortDrag(); PROTO::data->destroyResource(this); }); resource->setOnDestroy([this](CWlDataOffer* r) { - if (!dead) + if (!dead && (recvd || accepted)) PROTO::data->completeDrag(); + else + PROTO::data->abortDrag(); PROTO::data->destroyResource(this); }); @@ -592,6 +596,11 @@ void CWLDataDeviceProtocol::dropDrag() { return; } + if (!wasDragSuccessful()) { + abortDrag(); + return; + } + dnd.currentSource->sendDndDropPerformed(); dnd.focusedDevice->sendDrop(); dnd.focusedDevice->sendLeave(); @@ -603,6 +612,21 @@ void CWLDataDeviceProtocol::dropDrag() { dnd.overriddenCursor = false; } +bool CWLDataDeviceProtocol::wasDragSuccessful() { + if (!dnd.focusedDevice || !dnd.currentSource) + return false; + + for (auto& o : m_vOffers) { + if (o->dead || !o->source || !o->source->hasDnd()) + continue; + + if (o->recvd || o->accepted) + return true; + } + + return false; +} + void CWLDataDeviceProtocol::completeDrag() { resetDndState(); diff --git a/src/protocols/core/DataDevice.hpp b/src/protocols/core/DataDevice.hpp index f31725ee..5b31559f 100644 --- a/src/protocols/core/DataDevice.hpp +++ b/src/protocols/core/DataDevice.hpp @@ -175,6 +175,7 @@ class CWLDataDeviceProtocol : public IWaylandProtocol { void dropDrag(); void completeDrag(); void resetDndState(); + bool wasDragSuccessful(); // SP dataDeviceForClient(wl_client*);