Client: Always populate mimedata in drags

It's possible for clients to perform a drag and drop operation within
their own client without any mimeData. A user can directly access the
original drag.

On wayland without any mimedata it's impossible for a client to accept a
drag as the mechansim involved is to either select a given mimedata
entry or an empty string. Within Qt we always accept the first format if
we accept a drag.

When dragging within our own window we also start a wayland drag so will
receive a cancel event from the compositor if the compositor doesn't
believe the client has accepted the drag.

This patch provides a dummy mimedata entry so that something can be
accepted.

Fixes: QTBUG-112161
Pick-to: 6.6 6.5 6.2 5.15
Change-Id: I6309d82e20545e10ebdb9dafde7e13a5e3be5ff2
Reviewed-by: Liang Qi <liang.qi@qt.io>
This commit is contained in:
David Edmundson 2023-05-17 09:06:03 +03:00 committed by Liang Qi
parent c16f6d4051
commit d76ce4732e

View File

@ -93,6 +93,12 @@ bool QWaylandDataDevice::startDrag(QMimeData *mimeData, Qt::DropActions supporte
return false;
}
// dragging data without mimetypes is a legal operation in Qt terms
// but Wayland uses a mimetype to determine if a drag is accepted or not
// In this rare case, insert a placeholder
if (mimeData->formats().isEmpty())
mimeData->setData("application/x-qt-avoid-empty-placeholder"_L1, QByteArray("1"));
m_dragSource.reset(new QWaylandDataSource(m_display->dndSelectionHandler(), mimeData));
if (version() >= 3)