diff options
author | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2017-01-05 16:16:43 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-03-01 18:01:44 +0000 |
commit | 71a2dbed467be0041b6793dda868655b2632e830 (patch) | |
tree | 64d101d2e1257c86fbaadefa59176f5430aa6a8e /src/quick/items | |
parent | 59c94123e3661274d14f69c3df71fae9325b7eea (diff) |
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 4dc8cd0a37..340683f6c3 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2593,9 +2593,14 @@ bool QQuickWindowPrivate::sendFilteredTouchEvent(QQuickItem *target, QQuickItem qCDebug(DBG_TOUCH) << " - second chance intercepted on childMouseEventFilter by " << target; if (t != QEvent::MouseButtonRelease) { qCDebug(DBG_TOUCH_TARGET) << "TP" << tp.id() << "->" << target; - touchMouseId = tp.id(); touchMouseDevice = event->device(); - touchMouseDevice->pointerEvent()->pointById(tp.id())->setGrabber(target); + if (touchMouseId == -1) { + // the point was grabbed as a pure touch point before, now it will be treated as mouse + // but the old receiver still needs to be informed + if (auto oldGrabber = touchMouseDevice->pointerEvent()->pointById(tp.id())->grabber()) + oldGrabber->touchUngrabEvent(); + } + touchMouseId = tp.id(); target->grabMouse(); } filtered = true; |