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;
|
mousePressButton = Qt::NoButton;
|
||||||
} else {
|
} else {
|
||||||
static unsigned long lastPressTimestamp = 0;
|
static unsigned long lastPressTimestamp = 0;
|
||||||
|
static QPointer<QWindow> lastPressWindow = nullptr;
|
||||||
mouse_buttons = e->buttons;
|
mouse_buttons = e->buttons;
|
||||||
if (mousePress) {
|
if (mousePress) {
|
||||||
ulong doubleClickInterval = static_cast<ulong>(QGuiApplication::styleHints()->mouseDoubleClickInterval());
|
ulong doubleClickInterval = static_cast<ulong>(QGuiApplication::styleHints()->mouseDoubleClickInterval());
|
||||||
const auto timestampDelta = e->timestamp - lastPressTimestamp;
|
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;
|
mousePressButton = button;
|
||||||
lastPressTimestamp = e ->timestamp;
|
lastPressTimestamp = e ->timestamp;
|
||||||
|
lastPressWindow = e->window;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1920,6 +1920,28 @@ void tst_QWindow::mouseEventSequence()
|
|||||||
QCOMPARE(window.mouseReleasedCount, 4);
|
QCOMPARE(window.mouseReleasedCount, 4);
|
||||||
QCOMPARE(window.mouseDoubleClickedCount, 0);
|
QCOMPARE(window.mouseDoubleClickedCount, 0);
|
||||||
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prprprpr"));
|
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()
|
void tst_QWindow::windowModality()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user