summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXu Shitong <[email protected]>2025-03-14 17:01:33 +0800
committerXu Shitong <[email protected]>2025-04-14 16:41:41 +0000
commitbe2729cd7cfad3f3570bca64253bdfb50b3fb997 (patch)
tree10659d9375aa7ab8c7a08d9f76ee789d2cf1b031
parent3265f409394e821605cfd1888a26f7fbdd4ba682 (diff)
QGuiApplication: Prevent double-click recognition across different windows
Two consecutive clicks on different windows should not be recognized as a double-click event. Add window tracking to ensure double-clicks are only detected when they occur within the same window. Changes: - Add static QWindow tracking for last pressed window - Add window equality check in double-click detection logic - Update window tracking after each mouse press event - Add test auto test case Fixes: QTBUG-134721 Change-Id: I0ca8460a447ca27b04f3d545176d478c90f6b830 Reviewed-by: Tor Arne Vestbø <[email protected]>
-rw-r--r--src/gui/kernel/qguiapplication.cpp5
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp22
2 files changed, 26 insertions, 1 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 0ed73c18362..c516c56bc78 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -2395,13 +2395,16 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo
mousePressButton = Qt::NoButton;
} else {
static unsigned long lastPressTimestamp = 0;
+ static QPointer<QWindow> lastPressWindow = nullptr;
mouse_buttons = e->buttons;
if (mousePress) {
ulong doubleClickInterval = static_cast<ulong>(QGuiApplication::styleHints()->mouseDoubleClickInterval());
const auto timestampDelta = e->timestamp - lastPressTimestamp;
- doubleClick = timestampDelta > 0 && timestampDelta < doubleClickInterval && button == mousePressButton;
+ doubleClick = timestampDelta > 0 && timestampDelta < doubleClickInterval
+ && button == mousePressButton && lastPressWindow == e->window;
mousePressButton = button;
lastPressTimestamp = e ->timestamp;
+ lastPressWindow = e->window;
}
}
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 71fb2705f52..4c826a1db9e 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -1920,6 +1920,28 @@ void tst_QWindow::mouseEventSequence()
QCOMPARE(window.mouseReleasedCount, 4);
QCOMPARE(window.mouseDoubleClickedCount, 0);
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prprprpr"));
+
+ // Test double click across windows
+ InputTestWindow windowNew;
+ windowNew.setGeometry(QRect(m_availableTopLeft + QPoint(80, 80), m_testWindowSize));
+ windowNew.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&windowNew));
+
+ timestamp += doubleClickInterval;
+ windowNew.resetCounters();
+ window.resetCounters();
+
+ simulateMouseClick(&windowNew, timestamp, local, local);
+ simulateMouseClick(&window, timestamp, local, local);
+ QCoreApplication::processEvents();
+ QCOMPARE(windowNew.mousePressedCount, 1);
+ QCOMPARE(windowNew.mouseReleasedCount, 1);
+ QCOMPARE(windowNew.mouseDoubleClickedCount, 0);
+ QCOMPARE(windowNew.mouseSequenceSignature, QLatin1String("pr"));
+ QCOMPARE(window.mousePressedCount, 1);
+ QCOMPARE(window.mouseReleasedCount, 1);
+ QCOMPARE(window.mouseDoubleClickedCount, 0);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("pr"));
}
void tst_QWindow::windowModality()