diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-07-05 23:05:32 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-07-15 23:02:11 +0000 |
commit | f11824fcb0a439beaebde2ec26f4574e207e0d07 (patch) | |
tree | d5189dfbcb22364c093074c9c7407267588f4a30 /tests | |
parent | 8b607bd146d033e90a8bdb8192c906aef9be8f0c (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.qml | 3 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 35 |
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" |