aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2016-07-08 14:46:08 +0200
committerFrederik Gladhorn <frederik.gladhorn@qt.io>2016-07-11 12:25:54 +0000
commit62719a97cf4640ff014d9ca0691cc1e7632ef173 (patch)
tree54d75c2e6126e45ec84804fb85c5c508581852d4
parent62bae5c556251eec5d5295c258df3fb85e3c1bcc (diff)
PointerEvents: start unified delivery code path
This really does nothing but join all incoming events, package them into pointer events and then unpack them to send them on their separate ways again. Change-Id: Iad87b86051963c064d7a41d9a64b4551efe1f039 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-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;