diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-16 15:00:08 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-19 21:32:45 +0100 |
commit | 18c2b4f6dbdc0e0d7e235c2547394d4dafa6dd41 (patch) | |
tree | bf20b77f7e050c5fef600bd1288c6c5c05ab0783 | |
parent | fd9e4920b3d8235061d2bde19bca7ded566f6331 (diff) |
Make sure we don't modify the incoming event objects when localizing
Restore the position of the single event point after event delivery.
Where possible, don't make a localized copy which explicitly shares
its data with the original anyway. Instead, access the original
directly.
Change-Id: I5efa44c336eddeef1a1ab00dc91e2d0f223ed31d
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 9 | ||||
-rw-r--r-- | src/quick/items/qquickmultipointtoucharea.cpp | 4 |
2 files changed, 9 insertions, 4 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index b451c275c2..2401f008aa 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1452,9 +1452,12 @@ void QQuickFlickable::mouseReleaseEvent(QMouseEvent *event) // Now send the release if (auto grabber = qmlobject_cast<QQuickItem *>(event->exclusiveGrabber(event->point(0)))) { - QMutableSinglePointEvent localized(*event); - localized.mutablePoint().setPosition(grabber->mapFromScene(localized.scenePosition())); - QCoreApplication::sendEvent(window(), &localized); + // not copying or detaching anything, so make sure we return the original event unchanged + QMutableSinglePointEvent *localized = QMutableSinglePointEvent::from(event); + const auto oldPosition = localized->mutablePoint().position(); + localized->mutablePoint().setPosition(grabber->mapFromScene(localized->scenePosition())); + QCoreApplication::sendEvent(window(), localized); + localized->mutablePoint().setPosition(oldPosition); } // And the event has been consumed diff --git a/src/quick/items/qquickmultipointtoucharea.cpp b/src/quick/items/qquickmultipointtoucharea.cpp index e23e7365df..ed424a3763 100644 --- a/src/quick/items/qquickmultipointtoucharea.cpp +++ b/src/quick/items/qquickmultipointtoucharea.cpp @@ -902,13 +902,14 @@ void QQuickMultiPointTouchArea::touchUngrabEvent() bool QQuickMultiPointTouchArea::sendMouseEvent(QMouseEvent *event) { - QPointF localPos = mapFromScene(event->scenePosition()); + const QPointF localPos = mapFromScene(event->scenePosition()); QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : nullptr; bool stealThisEvent = _stealMouse; if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) { QMutableSinglePointEvent mouseEvent(*event); + const auto oldPosition = mouseEvent.mutablePoint().position(); mouseEvent.mutablePoint().setPosition(localPos); mouseEvent.setSource(Qt::MouseEventSynthesizedByQt); mouseEvent.setAccepted(false); @@ -931,6 +932,7 @@ bool QQuickMultiPointTouchArea::sendMouseEvent(QMouseEvent *event) if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) grabMouse(); + mouseEvent.mutablePoint().setPosition(oldPosition); return stealThisEvent; } if (event->type() == QEvent::MouseButtonRelease) { |