From a54988c822de918933af62c3d39212f223bfb2c4 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 8 Sep 2020 08:45:24 +0200 Subject: Mouse->touch synthesis: send touch event with mouse device In 4e400369c08db251cd489fec1229398c224d02b4 we began to send synth-mouse events from the touch device, but in the opposite direction it was not consistent. Add autotests to prove that it's consistent both ways now. Change-Id: I7df2328fef224dc1529ca5d27411cd8a5a9c8df9 Reviewed-by: Volker Hilsheimer --- src/gui/kernel/qguiapplication.cpp | 7 +------ tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 2bbeef4c30..ffb9b26ee7 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -189,7 +189,6 @@ static Qt::LayoutDirection layout_direction = Qt::LayoutDirectionAuto; static bool force_reverse = false; QGuiApplicationPrivate *QGuiApplicationPrivate::self = nullptr; -QPointingDevice *QGuiApplicationPrivate::m_fakeTouchDevice = nullptr; int QGuiApplicationPrivate::m_fakeMouseSourcePointId = 0; #ifndef QT_NO_CLIPBOARD @@ -2282,10 +2281,6 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo if (!e->synthetic() && !ev.isAccepted() && !e->nonClientArea && qApp->testAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents)) { - if (!m_fakeTouchDevice) { - m_fakeTouchDevice = new QPointingDevice; - QWindowSystemInterface::registerInputDevice(m_fakeTouchDevice); - } QList points; QWindowSystemInterface::TouchPoint point; point.id = 1; @@ -2310,7 +2305,7 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo const QList &touchPoints = QWindowSystemInterfacePrivate::fromNativeTouchPoints(points, window, &type); - QWindowSystemInterfacePrivate::TouchEvent fake(window, e->timestamp, type, m_fakeTouchDevice, touchPoints, e->modifiers); + QWindowSystemInterfacePrivate::TouchEvent fake(window, e->timestamp, type, device, touchPoints, e->modifiers); fake.flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic; processTouchEvent(&fake); } diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index e84efa6ac3..c93783fd9c 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -45,6 +45,8 @@ # include #endif +Q_LOGGING_CATEGORY(lcTests, "qt.gui.tests") + class tst_QWindow: public QObject { Q_OBJECT @@ -957,6 +959,8 @@ public: } void mousePressEvent(QMouseEvent *event) override { + qCDebug(lcTests) << event; + mouseDevice = event->pointingDevice(); if (ignoreMouse) { event->ignore(); } else { @@ -971,6 +975,7 @@ public: } void mouseReleaseEvent(QMouseEvent *event) override { + qCDebug(lcTests) << event; if (ignoreMouse) { event->ignore(); } else { @@ -981,6 +986,7 @@ public: } void mouseMoveEvent(QMouseEvent *event) override { + qCDebug(lcTests) << event; buttonStateInGeneratedMove = event->buttons(); if (ignoreMouse) { event->ignore(); @@ -992,6 +998,7 @@ public: } void mouseDoubleClickEvent(QMouseEvent *event) override { + qCDebug(lcTests) << event; if (ignoreMouse) { event->ignore(); } else { @@ -1001,12 +1008,14 @@ public: } void touchEvent(QTouchEvent *event) override { + qCDebug(lcTests) << event; + touchDevice = event->pointingDevice(); if (ignoreTouch) { event->ignore(); return; } touchEventType = event->type(); - QList points = event->touchPoints(); + QList points = event->points(); for (int i = 0; i < points.count(); ++i) { switch (points.at(i).state()) { case QEventPoint::State::Pressed: @@ -1029,9 +1038,11 @@ public: { switch (e->type()) { case QEvent::Enter: + qCDebug(lcTests) << e; ++enterEventCount; break; case QEvent::Leave: + qCDebug(lcTests) << e; ++leaveEventCount; break; default: @@ -1063,6 +1074,9 @@ public: bool spinLoopWhenPressed = false; Qt::MouseButtons buttonStateInGeneratedMove; + + const QPointingDevice *mouseDevice = nullptr; + const QPointingDevice *touchDevice = nullptr; }; static void simulateMouseClick(QWindow *target, const QPointF &local, const QPointF &global) @@ -1176,6 +1190,8 @@ void tst_QWindow::touchToMouseTranslation() QTRY_COMPARE(window.mouseReleaseButton, int(Qt::LeftButton)); QTRY_COMPARE(window.mousePressScreenPos, pressArea.center()); QTRY_COMPARE(window.mouseMoveScreenPos, moveArea.center()); + QCOMPARE(window.mouseDevice, window.touchDevice); + QCOMPARE(window.mouseDevice->type(), QInputDevice::DeviceType::TouchScreen); window.mousePressButton = 0; window.mouseReleaseButton = 0; @@ -1258,6 +1274,8 @@ void tst_QWindow::mouseToTouchTranslation() QTRY_COMPARE(window.touchPressedCount, 1); QTRY_COMPARE(window.touchReleasedCount, 1); + QCOMPARE(window.mouseDevice, window.touchDevice); + QCOMPARE(window.touchDevice->type(), QInputDevice::DeviceType::Mouse); QCoreApplication::setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true); -- cgit v1.2.3