mirror of
https://git.FreeBSD.org/ports.git
synced 2024-10-18 19:49:40 +00:00
x11-toolkits/qt5-gui: add upstream fix to clipboard
Bug description from [2]: QXcbConnection::getTimestamp() returns a timestamp from an earlier PropertyNotify event which was already in the event queue. I found this issue when I was trying to figure out why gvim (with GTK+) exits with a BadWindow error when selecting or copying a large text to the clipboard in a KDE environment. It turns out that GTK+ uses the INCR protocol to send the data and QT uses getTimestamp (in QXcbClipboard::clipboardReadProperty) to set the start time of the transfer. Since that start time is incorrect QT expects data which hasn't been sent yet and closes the window. GTK+ still tries to add the data to the window which causes a BadWindow error. From [1]: xcb: add a timeout control when reading INCR property 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. Upstream Code Review [1]: https://codereview.qt-project.org/c/qt/qtbase/+/364040 Upstream Bug Report [2]: https://bugreports.qt.io/browse/QTBUG-56595
This commit is contained in:
parent
598cb70685
commit
43f4cf9162
@ -1,6 +1,6 @@
|
|||||||
PORTNAME= gui
|
PORTNAME= gui
|
||||||
DISTVERSION= ${QT5_VERSION}
|
DISTVERSION= ${QT5_VERSION}
|
||||||
PORTREVISION= 5
|
PORTREVISION= 6
|
||||||
CATEGORIES= x11-toolkits graphics
|
CATEGORIES= x11-toolkits graphics
|
||||||
PKGNAMEPREFIX= qt5-
|
PKGNAMEPREFIX= qt5-
|
||||||
|
|
||||||
|
@ -0,0 +1,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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user