summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
authorJan Arve Sæther <jan-arve.saether@qt.io>2023-11-16 16:37:38 +0100
committerJan Arve Sæther <jan-arve.saether@qt.io>2023-11-17 18:23:57 +0000
commit4bb230f65e9e27984479c07288a71797c8651b66 (patch)
tree3137c45c355afce4e8eee61ffb20bea97187866a /src/gui/kernel
parenta180dc5e27c4bb82d065d9c2fc6f2172bffb1ec6 (diff)
QGuiApplication: Fix condition for when doubleclick events are triggered
QGuiApplicationPrivate::processMouseEvent() requires the following conditions to be met in order to trigger a double click event: 1. The same button should be pressed (kept in mousePressButton member) 2. The time between two press events should not exceed doubleClickInterval 3. Movement between presses shouldn't be bigger than doubleClickDistance Unfortunately, when we are processing *synthesized* mouse events (from touch), in order to check criterion 2) we cannot rely on QPointingDevicePrivate::pointById(0)->eventPoint.pressTimestamp(); because this was already updated in QGuiApplication::processTouchEvent(), so it does not any longer reflect the *previous* press timestamp, but the current one. Therefore we could not reliably calculate the time between the previous press and the current press (in fact, it never exceeded the doubleClickInterval condition) I suspect this occurs with all touchscreens, but at least it was reproduced with e.g. a NVIDIA Terra / Thinkvision touch screen on Windows 11 and Dell Express SVC touch screen on Windows 11. => Since QGuiApplication is a singleton, add a static local variable to remember the time stamp of the last processed press event. Autotesting has been modelled in PS7. However, QTest::touchEvent is unable to synthesize hardware specific detection latency and stray touch events, which actually reproduce the issue. => Not adding an autotest. Fixes: QTBUG-112479 Fixes: QTBUG-119032 Fixes: QTBUG-100688 Pick-to: 6.6 6.5 Change-Id: Idc97fb9d49ed334f56d702d420451fc062e9b5a9 Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qguiapplication.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index abce792ad3..86715dcf9f 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -2256,12 +2256,14 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo
qAbs(globalPoint.y() - pressPos.y()) > doubleClickDistance)
mousePressButton = Qt::NoButton;
} else {
+ static unsigned long lastPressTimestamp = 0;
mouse_buttons = e->buttons;
if (mousePress) {
ulong doubleClickInterval = static_cast<ulong>(QGuiApplication::styleHints()->mouseDoubleClickInterval());
- doubleClick = e->timestamp - persistentEPD->eventPoint.pressTimestamp()
+ doubleClick = e->timestamp - lastPressTimestamp
< doubleClickInterval && button == mousePressButton;
mousePressButton = button;
+ lastPressTimestamp = e ->timestamp;
}
}