diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-11-10 12:53:44 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-11-14 18:03:43 +0000 |
commit | 3ae8b478e334fe307ec4b5d6b3ae39eb984fe6b3 (patch) | |
tree | 56b965ebdcb20768a49d479ad4ff62c962fbf95b | |
parent | 289edbf1f56f4f31e1e92113ab3c825edfec9f5b (diff) |
a PointerHandler can veto overtaking of grab by an Item
In order to make sure of it, we have to do the permission check
in the legacy call chain too: QQuickFlickable::filterMouseEvent() ->
QQuickItem::grabMouse() -> QQuickWindowPrivate::setMouseGrabber() ->
QQuickEventPoint::setGrabberItem() ->
QQuickPointerHandler::approveGrabTransition()
Change-Id: Ice3499bc56e7c89fb43b054ddcd0098fea94ba2a
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r-- | src/quick/items/qquickevents.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index 10b656d111..4a786d5569 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -765,12 +765,10 @@ QObject *QQuickEventPoint::exclusiveGrabber() const */ void QQuickEventPoint::setExclusiveGrabber(QObject *grabber) { - if (QQuickPointerHandler *phGrabber = qmlobject_cast<QQuickPointerHandler *>(grabber)) { + if (QQuickPointerHandler *phGrabber = qmlobject_cast<QQuickPointerHandler *>(grabber)) setGrabberPointerHandler(phGrabber, true); - } else if (QQuickPointerHandler *existingPhGrabber = grabberPointerHandler()) { - if (existingPhGrabber->approveGrabTransition(this, grabber)) - setGrabberItem(static_cast<QQuickItem *>(grabber)); - } + else + setGrabberItem(static_cast<QQuickItem *>(grabber)); } /*! @@ -792,15 +790,17 @@ QQuickItem *QQuickEventPoint::grabberItem() const void QQuickEventPoint::setGrabberItem(QQuickItem *grabber) { if (grabber != m_exclusiveGrabber.data()) { + QQuickPointerHandler *oldGrabberHandler = grabberPointerHandler(); + if (oldGrabberHandler && !oldGrabberHandler->approveGrabTransition(this, grabber)) + return; if (Q_UNLIKELY(lcPointerGrab().isDebugEnabled())) { qCDebug(lcPointerGrab) << pointDeviceName(this) << "point" << hex << m_pointId << pointStateString(this) << ": grab" << m_exclusiveGrabber << "->" << grabber; } - QQuickPointerHandler *oldGrabberHandler = grabberPointerHandler(); - QQuickItem *oldGrabberItem = grabberItem(); m_exclusiveGrabber = QPointer<QObject>(grabber); m_grabberIsHandler = false; m_sceneGrabPos = m_scenePos; + QQuickItem *oldGrabberItem = grabberItem(); if (oldGrabberHandler) oldGrabberHandler->onGrabChanged(oldGrabberHandler, (grabber ? CancelGrabExclusive : UngrabExclusive), this); else if (oldGrabberItem && oldGrabberItem != grabber && grabber && pointerEvent()->asPointerTouchEvent()) |