aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickitem.cpp
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2017-01-18 13:53:07 +0100
committerJan Arve Sæther <jan-arve.saether@qt.io>2017-02-07 16:30:18 +0000
commitfb8058e5bfbd412e4503eb280721e4875fda0936 (patch)
treee24830323e33f826071d28ba7f8c0e0160a8fa5d /src/quick/items/qquickitem.cpp
parente2fd141372335f917c2d216051abb00d8b15f87c (diff)
QQuickWindow: use QVector eventDeliveryTargets to avoid repeated delivery
If no handler or item accepts a newly-pressed point, the event will be re-delivered in deliverTouchEvent(). It doesn't make sense to re-deliver to the same handlers though. A temporary QSet isn't cheap to create, whereas it seems we will need to keep track of handlers which have already been visited, in order to avoid visiting passively-grabbing handlers multiple times. Since both a QVector and a QSet are heap-allocated, and we expect to have a limited quantity of handlers grabbing at one time, a retained QVector (cleared between events) seems to be the cheapest data structure. Change-Id: I831e9a2576b2fcb9095e065795f2baff58115a49 Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/quick/items/qquickitem.cpp')
-rw-r--r--src/quick/items/qquickitem.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 46e381db7d..9b91b4bda4 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -5095,12 +5095,14 @@ bool QQuickItemPrivate::handlePointerEvent(QQuickPointerEvent *event, bool avoid
{
Q_Q(QQuickItem);
bool delivered = false;
+ QVector<QQuickPointerHandler *> &eventDeliveryTargets = event->device()->eventDeliveryTargets();
if (extra.isAllocated()) {
for (QQuickPointerHandler *handler : extra->pointerHandlers) {
qCDebug(lcPointerHandlerDispatch) << " delivering" << event << "to" << handler << "on" << q;
- if (!avoidGrabber || !event->hasGrabber(handler)) {
+ if ((!avoidGrabber || !event->hasGrabber(handler)) && !eventDeliveryTargets.contains(handler)) {
handler->handlePointerEvent(event);
delivered = true;
+ eventDeliveryTargets.append(handler);
}
}
}