aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickwindow.cpp25
-rw-r--r--src/quick/items/qquickwindow_p.h6
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;