diff options
author | Xu Shitong <[email protected]> | 2025-03-14 17:01:33 +0800 |
---|---|---|
committer | Xu Shitong <[email protected]> | 2025-04-14 16:41:41 +0000 |
commit | be2729cd7cfad3f3570bca64253bdfb50b3fb997 (patch) | |
tree | 10659d9375aa7ab8c7a08d9f76ee789d2cf1b031 | |
parent | 3265f409394e821605cfd1888a26f7fbdd4ba682 (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.cpp | 5 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 22 |
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() |