File: 0081-Client-Always-populate-mimedata-in-drags.patch

package info (click to toggle)
qtwayland-opensource-src 5.15.15-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 11,124 kB
  • sloc: cpp: 53,685; xml: 9,462; ansic: 187; makefile: 29; sh: 5
file content (47 lines) | stat: -rw-r--r-- 1,946 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
From c80564c1dfe202c3975ca0ff67e0b72b0352bf13 Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
Date: Wed, 17 May 2023 09:06:03 +0300
Subject: [PATCH] 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>
(cherry picked from commit 32fedb6fa6579711b6cb192a2e3cfb7ad1264546)

* asturmlechner 2023-10-24: Backported L1 literal as QString::fromLatin1
---
 src/client/qwaylanddatadevice.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

--- a/src/client/qwaylanddatadevice.cpp
+++ b/src/client/qwaylanddatadevice.cpp
@@ -124,6 +124,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(QString::fromLatin1("application/x-qt-avoid-empty-placeholder"), QByteArray("1"));
+
     m_dragSource.reset(new QWaylandDataSource(m_display->dndSelectionHandler(), mimeData));
 
     if (wl_data_device_get_version(object()) >= 3)