diff --git a/src/imports/imports.pro b/src/imports/imports.pro index e18860227..6e70773be 100644 --- a/src/imports/imports.pro +++ b/src/imports/imports.pro @@ -27,4 +27,4 @@ qtHaveModule(quick) { qtConfig(quick-path): SUBDIRS += shapes } -qtHaveModule(xmlpatterns) : SUBDIRS += xmllistmodel +OE_QTXMLPATTERNS_ENABLED:qtHaveModule(xmlpatterns) : SUBDIRS += xmllistmodel diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index d4aba31e2..a793c2ec0 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -1365,10 +1365,18 @@ QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event) point->reset(tps.at(i), ev->timestamp()); const auto &preserved = preserves.at(i); if (point->state() == QQuickEventPoint::Pressed) { - if (preserved.grabber) - qWarning() << "TouchPointPressed without previous release event" << point; - point->setGrabberItem(nullptr); - point->clearPassiveGrabbers(); + if (preserved.grabber) { + qWarning() << "(fixed) TouchPointPressed without previous release event" << point; + if (QQuickItem *grabber = point->grabberItem()) { + QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(grabber->window()); + if (windowPriv->isDeliveringTouchAsMouse()) { + windowPriv->cancelTouchMouseSynthesis(); + QQuickPointerEvent *ev = windowPriv->queryPointerEventInstance(windowPriv->touchMouseDevice); + if (ev) + ev->point(0)->cancelExclusiveGrab(); + } + } + } } else { // Restore the grabbers without notifying (don't call onGrabChanged) Q_ASSERT(preserved.pointId == 0 || preserved.pointId == point->pointId()); diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 5cd04decf..a0b50d990 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -649,6 +649,14 @@ bool QQuickWindowPrivate::checkIfDoubleClicked(ulong newPressEventTimestamp) return doubleClicked; } + +void QQuickWindowPrivate::cancelTouchMouseSynthesis() +{ + qCDebug(DBG_TOUCH_TARGET); + touchMouseId = -1; + touchMouseDevice = nullptr; +} + bool QQuickWindowPrivate::deliverTouchAsMouse(QQuickItem *item, QQuickPointerEvent *pointerEvent) { Q_Q(QQuickWindow); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index b5e3a2c1e..6e7671bf3 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -137,6 +137,7 @@ public: QQuickPointerDevice *touchMouseDevice; bool checkIfDoubleClicked(ulong newPressEventTimestamp); ulong touchMousePressTimestamp; + void cancelTouchMouseSynthesis(); // Mouse positions are saved in widget coordinates QPointF lastMousePosition; diff --git a/tests/auto/quick/quick.pro b/tests/auto/quick/quick.pro index a54a707f4..ddb9dcbbc 100644 --- a/tests/auto/quick/quick.pro +++ b/tests/auto/quick/quick.pro @@ -44,7 +44,7 @@ PRIVATETESTS += \ qquickxmllistmodel # This test requires the xmlpatterns module -!qtHaveModule(xmlpatterns): PRIVATETESTS -= qquickxmllistmodel +!OE_QTXMLPATTERNS_ENABLED|!qtHaveModule(xmlpatterns): PRIVATETESTS -= qquickxmllistmodel QUICKTESTS += \ pointerhandlers \