summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIonen Wolkens <ionen@gentoo.org>2024-09-30 17:45:55 -0400
committerIonen Wolkens <ionen@gentoo.org>2024-10-01 14:08:02 -0400
commitd855faed9dc5e08c6d0ab5dd35242faf5ca8e799 (patch)
treea332736c684f1dd85271eaf6d164cc9f857d1f90 /dev-qt/qtbase
parentapp-dicts/myspell-en: Stabilize 20240801 ALLARCHES, #940613 (diff)
downloadgentoo-d855faed9dc5e08c6d0ab5dd35242faf5ca8e799.tar.gz
gentoo-d855faed9dc5e08c6d0ab5dd35242faf5ca8e799.tar.bz2
gentoo-d855faed9dc5e08c6d0ab5dd35242faf5ca8e799.zip
dev-qt/qtbase: revert upstream commit causing erratic mouse input
Signed-off-by: Ionen Wolkens <ionen@gentoo.org>
Diffstat (limited to 'dev-qt/qtbase')
-rw-r--r--dev-qt/qtbase/files/qtbase-6.7.3-erratic-mouse-input.patch156
-rw-r--r--dev-qt/qtbase/qtbase-6.7.3-r1.ebuild (renamed from dev-qt/qtbase/qtbase-6.7.3.ebuild)1
2 files changed, 157 insertions, 0 deletions
diff --git a/dev-qt/qtbase/files/qtbase-6.7.3-erratic-mouse-input.patch b/dev-qt/qtbase/files/qtbase-6.7.3-erratic-mouse-input.patch
new file mode 100644
index 000000000000..14bdf1463949
--- /dev/null
+++ b/dev-qt/qtbase/files/qtbase-6.7.3-erratic-mouse-input.patch
@@ -0,0 +1,156 @@
+https://bugreports.qt.io/browse/QTBUG-129509
+https://bugreports.qt.io/browse/QTBUG-129514
+https://codereview.qt-project.org/c/qt/qtbase/+/594889
+From 42845904d51ad14b2ab41a165bd9b9b1a9459840 Mon Sep 17 00:00:00 2001
+From: Liang Qi <liang.qi@qt.io>
+Date: Tue, 01 Oct 2024 12:46:30 +0200
+Subject: [PATCH] Revert "xcb: handle XI2 input button and motion events from slave devices"
+
+This reverts commit b71be292780b858f2c55ce92601452e2ea946de2, which causes a regression when using mouse wheel and moving cursor together
+on scroll bar for some qt applications, like qutebrowser and
+qbittorrent.
+
+Fixes: QTBUG-129509
+Fixes: QTBUG-129514
+Task-number: QTBUG-110841
+Pick-to: 6.8.0 6.8 6.7 6.5 6.2 5.15
+Change-Id: I703158874413a1306ea99217bced4ba38382f543
+--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
++++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
+@@ -683,94 +683,21 @@
+ }
+
+-//implementation is ported from https://codereview.qt-project.org/c/qt/qtbase/+/231552/12/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp#558
+-namespace {
+-
+-/*! \internal
+-
+- Qt listens for XIAllDevices to avoid losing mouse events. This function
+- ensures that we don't process the same event twice: from a slave device and
+- then again from a master device.
+-
+- In a normal use case (e.g. mouse press and release inside a window), we will
+- drop events from master devices as duplicates. Other advantage of processing
+- events from slave devices is that they don't share button state. All buttons
+- on a master device share the state.
+-
+- Examples of special cases:
+-
+-\list
+-
+-\li During system move/resize, window manager (_NET_WM_MOVERESIZE) grabs the
+- master pointer, in this case we process the matching release from the slave
+- device. A master device event is not sent by the server, hence no duplicate
+- event to drop. If we listened for XIAllMasterDevices instead, we would never
+- see a release event in this case.
+-
+-\li If we dismiss a context menu by clicking somewhere outside a Qt application,
+- we will process the mouse press from the master pointer as that is the
+- device we are grabbing. We are not grabbing slave devices (grabbing on the
+- slave device is buggy according to 19d289ab1b5bde3e136765e5432b5c7d004df3a4).
+- And since the event occurs outside our window, the slave device event is
+- not sent to us by the server, hence no duplicate event to drop.
+-
+-\endlist
+-*/
+-bool isDuplicateEvent(xcb_ge_event_t *event)
+-{
+- Q_ASSERT(event);
+-
+- struct qXIEvent {
+- bool isValid = false;
+- uint16_t sourceid;
+- uint8_t evtype;
+- uint32_t detail;
+- int32_t root_x;
+- int32_t root_y;
+- };
+- static qXIEvent lastSeenEvent;
+-
+- bool isDuplicate = false;
+- auto *xiDeviceEvent = reinterpret_cast<qt_xcb_input_device_event_t *>(event);
+- if (lastSeenEvent.isValid) {
+- isDuplicate = lastSeenEvent.sourceid == xiDeviceEvent->sourceid &&
+- lastSeenEvent.evtype == xiDeviceEvent->event_type &&
+- lastSeenEvent.detail == xiDeviceEvent->detail &&
+- lastSeenEvent.root_x == xiDeviceEvent->root_x &&
+- lastSeenEvent.root_y == xiDeviceEvent->root_y;
+- } else {
+- lastSeenEvent.isValid = true;
+- }
+- lastSeenEvent.sourceid = xiDeviceEvent->sourceid;
+- lastSeenEvent.evtype = xiDeviceEvent->event_type;
+- lastSeenEvent.detail = xiDeviceEvent->detail;
+- lastSeenEvent.root_x = xiDeviceEvent->root_x;
+- lastSeenEvent.root_y = xiDeviceEvent->root_y;
+-
+- if (isDuplicate) {
+- qCDebug(lcQpaXInputEvents, "Duplicate XI2 event %d", event->event_type);
+- // This sanity check ensures that special cases like QTBUG-59277 keep working.
+- lastSeenEvent.isValid = false; // An event can be a duplicate only once.
+- }
+-
+- return isDuplicate;
+-}
+-
+-} // namespace
+-
+ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
+ {
+ auto *xiEvent = reinterpret_cast<qt_xcb_input_device_event_t *>(event);
+- if (m_xiSlavePointerIds.contains(xiEvent->deviceid)) {
+- if (!(xiEvent->event_type == XCB_INPUT_BUTTON_PRESS
+- || xiEvent->event_type == XCB_INPUT_BUTTON_RELEASE
+- || xiEvent->event_type == XCB_INPUT_MOTION)) {
+- if (!m_duringSystemMoveResize)
+- return;
+- if (xiEvent->event == XCB_NONE)
+- return;
+-
+- if (xiEvent->event_type == XCB_INPUT_TOUCH_END)
+- abortSystemMoveResize(xiEvent->event);
++ setTime(xiEvent->time);
++ if (m_xiSlavePointerIds.contains(xiEvent->deviceid) && xiEvent->event_type != XCB_INPUT_PROPERTY) {
++ if (!m_duringSystemMoveResize)
++ return;
++ if (xiEvent->event == XCB_NONE)
++ return;
+
++ if (xiEvent->event_type == XCB_INPUT_BUTTON_RELEASE
++ && xiEvent->detail == XCB_BUTTON_INDEX_1 ) {
++ abortSystemMoveResize(xiEvent->event);
++ } else if (xiEvent->event_type == XCB_INPUT_TOUCH_END) {
++ abortSystemMoveResize(xiEvent->event);
++ return;
++ } else {
+ return;
+ }
+@@ -784,25 +711,9 @@
+ case XCB_INPUT_BUTTON_PRESS:
+ case XCB_INPUT_BUTTON_RELEASE:
+- case XCB_INPUT_MOTION: {
+- if (isDuplicateEvent(event))
+- return;
+- if (m_xiSlavePointerIds.contains(xiEvent->deviceid)) {
+- if (m_duringSystemMoveResize) {
+- if (xiEvent->event_type == XCB_INPUT_BUTTON_RELEASE
+- && xiEvent->detail == XCB_BUTTON_INDEX_1 ) {
+- abortSystemMoveResize(xiEvent->event);
+- } else {
+- return;
+- }
+- }
+- }
+- xiDeviceEvent = xiEvent;
+- eventListener = windowEventListenerFromId(xiDeviceEvent->event);
+- sourceDeviceId = xiDeviceEvent->sourceid; // use the actual device id instead of the master
+- break;
+- }
++ case XCB_INPUT_MOTION:
+ case XCB_INPUT_TOUCH_BEGIN:
+ case XCB_INPUT_TOUCH_UPDATE:
+- case XCB_INPUT_TOUCH_END: {
++ case XCB_INPUT_TOUCH_END:
++ {
+ xiDeviceEvent = xiEvent;
+ eventListener = windowEventListenerFromId(xiDeviceEvent->event);
diff --git a/dev-qt/qtbase/qtbase-6.7.3.ebuild b/dev-qt/qtbase/qtbase-6.7.3-r1.ebuild
index 83f66ef4cd47..07859a84c2e5 100644
--- a/dev-qt/qtbase/qtbase-6.7.3.ebuild
+++ b/dev-qt/qtbase/qtbase-6.7.3-r1.ebuild
@@ -147,6 +147,7 @@ PATCHES=(
"${FILESDIR}"/${PN}-6.6.3-gcc14-avx512fp16.patch
"${FILESDIR}"/${PN}-6.7.2-qcontiguouscache.patch
"${FILESDIR}"/${PN}-6.7.2-haswell-no-rdrnd.patch
+ "${FILESDIR}"/${PN}-6.7.3-erratic-mouse-input.patch
)
src_prepare() {