diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 22 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 1 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 32 |
3 files changed, 47 insertions, 8 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 6e0d96a788..6a8f8582be 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -114,6 +114,7 @@ static bool force_reverse = false; QGuiApplicationPrivate *QGuiApplicationPrivate::self = 0; QTouchDevice *QGuiApplicationPrivate::m_fakeTouchDevice = 0; +int QGuiApplicationPrivate::m_fakeMouseSourcePointId = 0; #ifndef QT_NO_CLIPBOARD QClipboard *QGuiApplicationPrivate::qt_clipboard = 0; @@ -1036,11 +1037,22 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To if (touchEvent.device()->type() != QTouchDevice::TouchPad) { Qt::MouseButtons b = eventType == QEvent::TouchEnd ? Qt::NoButton : Qt::LeftButton; - const QTouchEvent::TouchPoint &touchPoint = touchEvent.touchPoints().first(); - - QWindowSystemInterfacePrivate::MouseEvent fake(w, e->timestamp, touchPoint.pos(), touchPoint.screenPos(), b, e->modifiers); - fake.synthetic = true; - processMouseEvent(&fake); + QList<QTouchEvent::TouchPoint> touchPoints = touchEvent.touchPoints(); + if (eventType == QEvent::TouchBegin) + m_fakeMouseSourcePointId = touchPoints.first().id(); + + for (int i = 0; i < touchPoints.count(); ++i) { + const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i); + if (touchPoint.id() == m_fakeMouseSourcePointId) { + QWindowSystemInterfacePrivate::MouseEvent fake(w, e->timestamp, + touchPoint.pos(), + touchPoint.screenPos(), + b, e->modifiers); + fake.synthetic = true; + processMouseEvent(&fake); + break; + } + } } } } diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 1e2abb22a0..09db13e28e 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -206,6 +206,7 @@ private: static QGuiApplicationPrivate *self; static QTouchDevice *m_fakeTouchDevice; + static int m_fakeMouseSourcePointId; }; Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k); diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index 99777d9252..ac8c8f9b20 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -246,10 +246,12 @@ public: keyReleaseCode = event->key(); } void mousePressEvent(QMouseEvent *event) { - if (ignoreMouse) + if (ignoreMouse) { event->ignore(); - else + } else { mousePressButton = event->button(); + mousePressScreenPos = event->screenPos(); + } } void mouseReleaseEvent(QMouseEvent *event) { if (ignoreMouse) @@ -257,6 +259,14 @@ public: else mouseReleaseButton = event->button(); } + void mouseMoveEvent(QMouseEvent *event) { + if (ignoreMouse) { + event->ignore(); + } else { + mouseMoveButton = event->button(); + mouseMoveScreenPos = event->screenPos(); + } + } void touchEvent(QTouchEvent *event) { if (ignoreTouch) { event->ignore(); @@ -285,7 +295,8 @@ public: } int keyPressCode, keyReleaseCode; - int mousePressButton, mouseReleaseButton; + int mousePressButton, mouseReleaseButton, mouseMoveButton; + QPointF mousePressScreenPos, mouseMoveScreenPos; int touchPressedCount, touchReleasedCount; bool ignoreMouse, ignoreTouch; @@ -339,12 +350,25 @@ void tst_QWindow::touchToMouseTranslation() QList<QWindowSystemInterface::TouchPoint> points; QWindowSystemInterface::TouchPoint tp1, tp2; + const QRectF pressArea(101, 102, 4, 4); + const QRectF moveArea(105, 108, 4, 4); tp1.id = 1; tp1.state = Qt::TouchPointPressed; + tp1.area = pressArea; tp2.id = 2; tp2.state = Qt::TouchPointPressed; points << tp1 << tp2; QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points); + // Now an update but with changed list order. The mouse event should still + // be generated from the point with id 1. + tp1.id = 2; + tp1.state = Qt::TouchPointStationary; + tp2.id = 1; + tp2.state = Qt::TouchPointMoved; + tp2.area = moveArea; + points.clear(); + points << tp1 << tp2; + QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points); points[0].state = Qt::TouchPointReleased; points[1].state = Qt::TouchPointReleased; QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points); @@ -352,6 +376,8 @@ void tst_QWindow::touchToMouseTranslation() QTRY_COMPARE(window.mousePressButton, int(Qt::LeftButton)); QTRY_COMPARE(window.mouseReleaseButton, int(Qt::LeftButton)); + QTRY_COMPARE(window.mousePressScreenPos, pressArea.center()); + QTRY_COMPARE(window.mouseMoveScreenPos, moveArea.center()); window.mousePressButton = 0; window.mouseReleaseButton = 0; |