@@ -194,6 +194,26 @@ void DirectionalDragArea::setImmediateRecognition(bool enabled)
197+bool DirectionalDragArea::monitorOnly() const
199+ return d->monitorOnly;
202+void DirectionalDragArea::setMonitorOnly(bool monitorOnly)
204+ if (d->monitorOnly != monitorOnly) {
205+ d->monitorOnly = monitorOnly;
207+ if (monitorOnly && d->status == DirectionalDragAreaPrivate::Undecided) {
208+ TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this);
209+ // We still wanna know when it ends for keeping the composition time window up-to-date
210+ TouchRegistry::instance()->addTouchWatcher(d->touchId, this);
213+ Q_EMIT monitorOnlyChanged(monitorOnly);
197void DirectionalDragArea::removeTimeConstraints()
217void DirectionalDragArea::removeTimeConstraints()
199 d->setMaxTime(60 * 60 * 1000);
219 d->setMaxTime(60 * 60 * 1000);
@@ -260,7 +280,10 @@ void DirectionalDragAreaPrivate::unownedTouchEvent(UnownedTouchEvent *unownedTou
260 unownedTouchEvent_undecided(unownedTouchEvent);
280 unownedTouchEvent_undecided(unownedTouchEvent);
262 default: // Recognized:
282 default: // Recognized:
263− // do nothing
283+ if (monitorOnly) {
284+ // Treat unowned event as if we owned it, but we are really just watching it
285+ touchEvent_recognized(event);
@@ -311,7 +334,9 @@ void DirectionalDragAreaPrivate::unownedTouchEvent_undecided(UnownedTouchEvent *
313 if (movedFarEnoughAlongGestureAxis()) {
336 if (movedFarEnoughAlongGestureAxis()) {
314− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
338+ TouchRegistry::instance()->requestTouchOwnership(touchId, q);
315 setStatus(Recognized);
340 setStatus(Recognized);
316 setPublicPos(touchPoint->pos());
341 setPublicPos(touchPoint->pos());
317 setPublicScenePos(touchScenePos);
342 setPublicScenePos(touchScenePos);
@@ -411,12 +436,18 @@ void DirectionalDragAreaPrivate::touchEvent_absent(QTouchEvent *event)
411 if (recognitionIsDisabled()) {
436 if (recognitionIsDisabled()) {
412 // Behave like a dumb TouchArea
437 // Behave like a dumb TouchArea
413 ddaDebug("Gesture recognition is disabled. Requesting touch ownership immediately.");
438 ddaDebug("Gesture recognition is disabled. Requesting touch ownership immediately.");
414− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
440+ TouchRegistry::instance()->requestTouchOwnership(touchId, q);
415 setStatus(Recognized);
442 setStatus(Recognized);
416 event->accept();
443 event->accept();
418 // just monitor the touch points for now.
445 // just monitor the touch points for now.
447+ watchPressedTouchPoints(touchPoints);
419− TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
449+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
421 setStatus(Undecided);
452 setStatus(Undecided);
422 // Let the item below have it. We will monitor it and grab it later if a gesture
453 // Let the item below have it. We will monitor it and grab it later if a gesture
@@ -884,5 +915,6 @@ DirectionalDragAreaPrivate::DirectionalDragAreaPrivate(DirectionalDragArea *q)
884 , recognitionTimer(nullptr)
915 , recognitionTimer(nullptr)
885 , timeSource(new RealTimeSource)
916 , timeSource(new RealTimeSource)
886 , activeTouches(timeSource)
917 , activeTouches(timeSource)
918+ , monitorOnly(false)