diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-12-28 20:27:18 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-01-27 09:36:03 +0000 |
commit | 9b5fc80af28580e9672792dd511d876a93947882 (patch) | |
tree | abaccc5d10bbb5bf8aba52e0e4cdbc08378bacf4 /src/quick/items/qquickwindow_p.h | |
parent | 9225ac7348c9023093b6ef8d4519087c7dddeaa2 (diff) |
build a vector of child-filtering parents before delivery of pointer event
Formerly during normal mouse or touch event delivery, sending it to
the Item needed to be done via QQuickWindow::sendEvent, which would
then call sendFilteredMouseEvent, which is a recursive function to
visit all the item's parents, check whether filtersChildMouseEvents()
returns true, if so then return early if childMouseEventFilter()
returns true. This is the mechanism by which Flickable (for example)
can monitor the movements of an eventpoint even while one of its
children has an exclusive grab, and can steal the grab away.
Now, we do this by building a vector of such parents first, then
visiting them in order. It might be more efficient, it eliminates
the recursion, and should eliminate the need for a QSet to ensure that
we don't visit the same parent more than once. We can't change the
behavior of QQuickWindow::sendEvent() because it's public API, but
now we don't use it as much internally.
Change-Id: I686fc5612c66eac09ec05c381a648ec65dec3923
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/quick/items/qquickwindow_p.h')
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index 30e3b71d0a..38c1b0a4d4 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -148,6 +148,7 @@ public: static QMouseEvent *cloneMouseEvent(QMouseEvent *event, QPointF *transformedLocalPos = 0); void deliverMouseEvent(QQuickPointerMouseEvent *pointerEvent); bool sendFilteredMouseEvent(QQuickItem *, QQuickItem *, QEvent *, QSet<QQuickItem *> *); + bool sendFilteredPointerEvent(QQuickPointerEvent *event, QQuickItem *receiver); #if QT_CONFIG(wheelevent) bool deliverWheelEvent(QQuickItem *, QWheelEvent *); #endif @@ -174,6 +175,7 @@ public: QVector<QQuickItem *> pointerTargets(QQuickItem *, const QPointF &, bool checkMouseButtons) const; QVector<QQuickItem *> mergePointerTargets(const QVector<QQuickItem *> &list1, const QVector<QQuickItem *> &list2) const; + void updateFilteringParentItems(const QVector<QQuickItem *> &targetItems); // hover delivery bool deliverHoverEvent(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp, bool &accepted); @@ -222,6 +224,7 @@ public: QList<QSGNode *> cleanupNodeList; QVector<QQuickItem *> itemsToPolish; + QVector<QPair<QQuickItem *,QQuickItem *> > filteringParentItems; // item:parent pairs qreal devicePixelRatio; QMetaObject::Connection physicalDpiChangedConnection; @@ -259,6 +262,8 @@ public: uint lastWheelEventAccepted : 1; bool componentCompleted : 1; + bool allowChildEventFiltering : 1; + Qt::FocusReason lastFocusReason; QOpenGLFramebufferObject *renderTarget; |