diff options
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 25 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 6 |
2 files changed, 24 insertions, 7 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index f263ed23d1..40b24724b2 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -1906,7 +1906,7 @@ void QQuickWindowPrivate::deliverDelayedTouchEvent() // Set delayedTouch to 0 before delivery to avoid redelivery in case of // event loop recursions (e.g if it the touch starts a dnd session). QScopedPointer<QTouchEvent> e(delayedTouch.take()); - deliverTouchEvent(e.data()); + deliverPointerEvent(currentPointerEvent.reset(e.data())); } static bool qquickwindow_no_touch_compression = qEnvironmentVariableIsSet("QML_NO_TOUCH_COMPRESSION"); @@ -1985,14 +1985,14 @@ void QQuickWindowPrivate::handleTouchEvent(QTouchEvent *event) qCDebug(DBG_TOUCH) << event; if (qquickwindow_no_touch_compression || touchRecursionGuard) { - deliverTouchEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); return; } if (!compressTouchEvent(event)) { if (delayedTouch) deliverDelayedTouchEvent(); - deliverTouchEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); } } @@ -2033,7 +2033,7 @@ void QQuickWindowPrivate::handleMouseEvent(QMouseEvent *event) case QEvent::MouseButtonPress: Q_QUICK_INPUT_PROFILE(QQuickProfiler::Mouse, QQuickProfiler::InputMousePress, event->button(), event->buttons()); - deliverMouseEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); break; case QEvent::MouseButtonRelease: Q_QUICK_INPUT_PROFILE(QQuickProfiler::Mouse, QQuickProfiler::InputMouseRelease, event->button(), @@ -2043,7 +2043,7 @@ void QQuickWindowPrivate::handleMouseEvent(QMouseEvent *event) return; } - deliverMouseEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); if (mouseGrabberItem && !event->buttons()) mouseGrabberItem->ungrabMouse(); break; @@ -2059,7 +2059,7 @@ void QQuickWindowPrivate::handleMouseEvent(QMouseEvent *event) return; } - deliverMouseEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); break; case QEvent::MouseMove: Q_QUICK_INPUT_PROFILE(QQuickProfiler::Mouse, QQuickProfiler::InputMouseMove, @@ -2086,7 +2086,7 @@ void QQuickWindowPrivate::handleMouseEvent(QMouseEvent *event) event->setAccepted(accepted); return; } - deliverMouseEvent(event); + deliverPointerEvent(currentPointerEvent.reset(event)); break; default: Q_ASSERT(false); @@ -2118,6 +2118,17 @@ void QQuickWindowPrivate::flushFrameSynchronousEvents() } } +void QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent *event) +{ + if (QMouseEvent *mouse = event->asMouseEvent()) { + deliverMouseEvent(mouse); + } else if (QTouchEvent *touch = event->asTouchEvent()) { + deliverTouchEvent(touch); + } else { + Q_ASSERT(false); + } +} + void QQuickWindowPrivate::deliverTouchEvent(QTouchEvent *event) { qCDebug(DBG_TOUCH) << " - delivering" << event; diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index e06fe4472d..713f33cc8f 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -53,6 +53,7 @@ #include "qquickitem.h" #include "qquickwindow.h" +#include "qquickevents_p_p.h" #include <QtQuick/private/qsgcontext_p.h> @@ -161,6 +162,7 @@ public: QHash<QQuickItem *, QList<QTouchEvent::TouchPoint> > *, QSet<QQuickItem*> *filtered); void handleTouchEvent(QTouchEvent *); void handleMouseEvent(QMouseEvent *); + void deliverPointerEvent(QQuickPointerEvent *); void deliverTouchEvent(QTouchEvent *); bool compressTouchEvent(QTouchEvent *); bool deliverTouchCancelEvent(QTouchEvent *); @@ -238,6 +240,10 @@ public: QQuickRenderControl *renderControl; QQuickAnimatorController *animationController; QScopedPointer<QTouchEvent> delayedTouch; + + // The current touch or mouse event that is delivered. + // This event gets re-used (reset) for every incoming mouse/touch event. + QQuickPointerEvent currentPointerEvent; int touchRecursionGuard; QQuickCustomRenderStage *customRenderStage; |