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:
parent
3265f40939
commit
be2729cd7c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user