commit:     d855faed9dc5e08c6d0ab5dd35242faf5ca8e799
Author:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
AuthorDate: Mon Sep 30 21:45:55 2024 +0000
Commit:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
CommitDate: Tue Oct  1 18:08:02 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d855faed

dev-qt/qtbase: revert upstream commit causing erratic mouse input

Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org>

 .../files/qtbase-6.7.3-erratic-mouse-input.patch   | 156 +++++++++++++++++++++
 ...{qtbase-6.7.3.ebuild => qtbase-6.7.3-r1.ebuild} |   1 +
 2 files changed, 157 insertions(+)

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...@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
similarity index 99%
rename from dev-qt/qtbase/qtbase-6.7.3.ebuild
rename to 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() {

Reply via email to