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ø <tor.arne.vestbo@qt.io>
This commit is contained in:
Xu Shitong 2025-03-14 17:01:33 +08:00
parent 3265f40939
commit be2729cd7c
2 changed files with 26 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -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()