aboutsummaryrefslogtreecommitdiff
path: root/x11-toolkits/qt5-gui/files/patch-git_73fc1f93-add_timeout_control_when_reading_incr_property
blob: 6f6dec7d35ece22a162a42431d03c74dfa599994 (plain) (blame)
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
48
49
50
51
52
53
54
55
56
57
58
59
From 73fc1f93e8bea1c493ed16655ad6fd68ae270e38 Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@qt.io>
Date: Wed, 7 Jul 2021 13:19:14 +0200
Subject: [PATCH] xcb: add a timeout control when reading INCR property
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

For the first call of QXcbClipboard::clipboardReadProperty()
inside of clipboardReadIncrementalProperty() in getSelection(),
it will get a XCB_NONE reply before the contents arrived via
property change. Then we give a chance to read more.

Manually tested with following setups:
* examples/widgets/mainwindows/application with gvim(gtk3)
* examples/widgets/widgets/imageviewer with GIMP 2.10.18(based on
gtk2) and GIMP 2.99.6(based on gtk3 via flatpak)

Fixes: QTBUG-56595
Done-With: JiDe Zhang <zhangjide@uniontech.com>
Change-Id: Ib45f08464d39ad79137b1da99808c89b7dca2d08
Reviewed-by: JiDe Zhang <zhangjide@uniontech.com>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit 02248eea5562c1df39ee23f195011afacc6759b0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/plugins/platforms/xcb/qxcbclipboard.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
index 725c0e4d514..a4940f1c491 100644
--- src/plugins/platforms/xcb/qxcbclipboard.cpp
+++ src/plugins/platforms/xcb/qxcbclipboard.cpp
@@ -841,6 +841,8 @@ QByteArray QXcbClipboard::clipboardReadIncrementalProperty(xcb_window_t win, xcb
         alloc_error = buf.size() != nbytes+1;
     }
 
+    QElapsedTimer timer;
+    timer.start();
     for (;;) {
         connection()->flush();
         xcb_generic_event_t *ge = waitForClipboardEvent(win, XCB_PROPERTY_NOTIFY);
@@ -876,9 +878,11 @@ QByteArray QXcbClipboard::clipboardReadIncrementalProperty(xcb_window_t win, xcb
                 tmp_buf.resize(0);
                 offset += length;
             }
-        } else {
-            break;
         }
+
+        const auto elapsed = timer.elapsed();
+        if (elapsed > clipboard_timeout)
+            break;
     }
 
     // timed out ... create a new requestor window, otherwise the requestor
-- 
2.16.3