aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquickflickable.cpp13
-rw-r--r--src/quick/items/qquickwindow.cpp2
2 files changed, 9 insertions, 6 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index 31c1c33b10..9e7b2a4f17 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -2529,12 +2529,15 @@ bool QQuickFlickable::childMouseEventFilter(QQuickItem *i, QEvent *e)
return QQuickItem::childMouseEventFilter(i, e);
}
- if (e->isPointerEvent()) {
+ if (e->type() == QEvent::UngrabMouse) {
+ Q_ASSERT(e->isSinglePointEvent());
+ auto spe = static_cast<QSinglePointEvent *>(e);
+ const QObject *grabber = spe->exclusiveGrabber(spe->points().first());
+ qCDebug(lcFilter) << "filtering UngrabMouse" << spe->points().first() << "for" << i << "grabber is" << grabber;
+ if (grabber != this)
+ mouseUngrabEvent(); // A child has been ungrabbed
+ } else if (e->isPointerEvent()) {
return filterPointerEvent(i, static_cast<QPointerEvent *>(e));
- } else if (e->type() == QEvent::UngrabMouse && d->window &&
- d->window->mouseGrabberItem() && d->window->mouseGrabberItem() != this) {
- // The grab has been taken away from a child and given to some other item.
- mouseUngrabEvent();
}
return QQuickItem::childMouseEventFilter(i, e);
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index d613b7e4f5..8183988835 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -2605,7 +2605,7 @@ void QQuickWindowPrivate::onGrabChanged(QObject *grabber, QPointingDevice::GrabT
if (isDeliveringTouchAsMouse() ||
point.device()->type() == QInputDevice::DeviceType::Mouse ||
point.device()->type() == QInputDevice::DeviceType::TouchPad) {
- QEvent e(QEvent::UngrabMouse);
+ QMutableSinglePointEvent e(QEvent::UngrabMouse, point.device(), point);
hasFiltered.clear();
filtered = sendFilteredMouseEvent(&e, item, item->parentItem());
if (!filtered)