aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2022-07-05 23:05:32 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-07-15 23:02:11 +0000
commitf11824fcb0a439beaebde2ec26f4574e207e0d07 (patch)
treed5189dfbcb22364c093074c9c7407267588f4a30 /tests
parent8b607bd146d033e90a8bdb8192c906aef9be8f0c (diff)
Don't ungrab for a TabletRelease event: wait for the synth-mouse release
Many QTabletEvents are not handled, so being able to "press a button" or other kinds of basic UI interaction depend on tablet->mouse synthesis in QGuiApplicationPrivate::processTabletEvent(). If a basic mouse-handling Item like a MouseArea or Button grabs on _mouse_ press, it needs to receive the _mouse_ release too; so DeliveryAgent must not take away its grab until that happens. Amends a97759a336c597327cb82eebc9f45c793aec32c9 Fixes: QTBUG-98936 Fixes: QTBUG-102764 Fixes: QTBUG-103937 Change-Id: I6d75d988d617bc3ceb8465f939d0a69485278cdf Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Doris Verria <doris.verria@qt.io> (cherry picked from commit 718bef9d2c85989479a8eef7e3a2837c42230c07) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/qquickmousearea/data/simple.qml3
-rw-r--r--tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp35
2 files changed, 37 insertions, 1 deletions
diff --git a/tests/auto/quick/qquickmousearea/data/simple.qml b/tests/auto/quick/qquickmousearea/data/simple.qml
index 56d561e5af..2b8a2af118 100644
--- a/tests/auto/quick/qquickmousearea/data/simple.qml
+++ b/tests/auto/quick/qquickmousearea/data/simple.qml
@@ -4,8 +4,9 @@ Rectangle {
id: whiteRect
width: 200
height: 200
- color: "white"
+ color: ma.pressed ? "lightsteelblue" : "white"
MouseArea {
+ id: ma
objectName: "mousearea"
anchors.fill: parent
}
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
index f6080d94cd..ecdb57955f 100644
--- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
+++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
@@ -42,6 +42,7 @@
#include <QtGui/QCursor>
#include <QtGui/QScreen>
#include <qpa/qwindowsysteminterface.h>
+#include <qpa/qwindowsysteminterface_p.h>
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
@@ -159,6 +160,9 @@ private slots:
void containsMouseAndVisibility();
void doubleClickToHide();
void releaseFirstTouchAfterSecond();
+#if QT_CONFIG(tabletevent)
+ void tabletStylusTap();
+#endif
private:
int startDragDistance() const {
@@ -2420,6 +2424,37 @@ void tst_QQuickMouseArea::releaseFirstTouchAfterSecond() // QTBUG-103766
QTRY_COMPARE(releaseSpy.count(), 1);
}
+#if QT_CONFIG(tabletevent)
+void tst_QQuickMouseArea::tabletStylusTap()
+{
+ QVERIFY(qApp->testAttribute(Qt::AA_SynthesizeMouseForUnhandledTabletEvents)); // MouseArea depends on it
+ QQuickView window;
+ QVERIFY(QQuickTest::showView(window, testFileUrl("simple.qml")));
+ QQuickMouseArea *mouseArea = window.rootObject()->findChild<QQuickMouseArea *>();
+ QVERIFY(mouseArea);
+ QSignalSpy pressSpy(mouseArea, SIGNAL(pressed(QQuickMouseEvent*)));
+ QSignalSpy releaseSpy(mouseArea, &QQuickMouseArea::released);
+ QSignalSpy clickSpy(mouseArea, &QQuickMouseArea::clicked);
+ const qint64 stylusId = 1234567890;
+
+ const QPoint point(100,100);
+ QWindowSystemInterface::handleTabletEvent(&window, point, window.mapToGlobal(point),
+ int(QInputDevice::DeviceType::Stylus), int(QPointingDevice::PointerType::Pen),
+ Qt::LeftButton, 0.5, 0, 0, 0, 0, 0, stylusId, Qt::NoModifier);
+ if (QWindowSystemInterfacePrivate::TabletEvent::platformSynthesizesMouse)
+ QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, point); // simulate what the platform does
+ QTRY_COMPARE(pressSpy.count(), 1);
+ QWindowSystemInterface::handleTabletEvent(&window, point, window.mapToGlobal(point),
+ int(QInputDevice::DeviceType::Stylus), int(QPointingDevice::PointerType::Pen),
+ Qt::NoButton, 0.5, 0, 0, 0, 0, 0, stylusId, Qt::NoModifier);
+ if (QWindowSystemInterfacePrivate::TabletEvent::platformSynthesizesMouse)
+ QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, point);
+ QTRY_COMPARE(releaseSpy.count(), 1);
+ QCOMPARE(clickSpy.count(), 1);
+ QCOMPARE(pressSpy.count(), 1);
+}
+#endif
+
QTEST_MAIN(tst_QQuickMouseArea)
#include "tst_qquickmousearea.moc"