diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-12-16 17:05:21 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-12-16 17:05:21 +0100 |
commit | 13e88fe2b9b1680cb161a249289c3ba998f08c0c (patch) | |
tree | 496a9d88c69b441e8c88aa0416b327faca3a1532 /src/quick/items/qquickwindow.cpp | |
parent | a2dad3ddee9c4bf274a7c6469342e4104605ceeb (diff) | |
parent | 470ba767663e4ad9d3183fb56ee89361354dfefb (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Conflicts:
src/quick/items/qquickitem.cpp
src/quick/items/qquicktext.cpp
tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
Change-Id: I0bc5786098193c2c40b6fd8905de75d90f6ed0cf
Diffstat (limited to 'src/quick/items/qquickwindow.cpp')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 10906dd64c..63a3b5d820 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -600,6 +600,28 @@ bool QQuickWindowPrivate::translateTouchToMouse(QQuickItem *item, QTouchEvent *e return false; } +void QQuickWindowPrivate::setMouseGrabber(QQuickItem *grabber) +{ + Q_Q(QQuickWindow); + if (mouseGrabberItem == grabber) + return; + + QQuickItem *oldGrabber = mouseGrabberItem; + mouseGrabberItem = grabber; + + if (touchMouseId != -1) { + // update the touch item for mouse touch id to the new grabber + itemForTouchPointId.remove(touchMouseId); + if (grabber) + itemForTouchPointId[touchMouseId] = grabber; + } + + if (oldGrabber) { + QEvent ev(QEvent::UngrabMouse); + q->sendEvent(oldGrabber, &ev); + } +} + void QQuickWindowPrivate::transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform) { QMatrix4x4 transformMatrix(transform); @@ -661,6 +683,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q QQuickItemPrivate *scopePrivate = scope ? QQuickItemPrivate::get(scope) : 0; QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + QQuickItem *currentActiveFocusItem = activeFocusItem; QQuickItem *newActiveFocusItem = 0; QVarLengthArray<QQuickItem *, 20> changed; @@ -737,7 +760,8 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q q->sendEvent(newActiveFocusItem, &event); } - emit q->focusObjectChanged(activeFocusItem); + if (activeFocusItem != currentActiveFocusItem) + emit q->focusObjectChanged(activeFocusItem); if (!changed.isEmpty()) notifyFocusChangesRecur(changed.data(), changed.count() - 1); @@ -764,6 +788,7 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item, return;//No focus, nothing to do. } + QQuickItem *currentActiveFocusItem = activeFocusItem; QQuickItem *oldActiveFocusItem = 0; QQuickItem *newActiveFocusItem = 0; @@ -820,7 +845,8 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item, q->sendEvent(newActiveFocusItem, &event); } - emit q->focusObjectChanged(activeFocusItem); + if (activeFocusItem != currentActiveFocusItem) + emit q->focusObjectChanged(activeFocusItem); if (!changed.isEmpty()) notifyFocusChangesRecur(changed.data(), changed.count() - 1); @@ -1218,8 +1244,11 @@ bool QQuickWindow::event(QEvent *e) case QEvent::TouchEnd: { QTouchEvent *touch = static_cast<QTouchEvent*>(e); d->translateTouchEvent(touch); - // return in order to avoid the QWindow::event below - return d->deliverTouchEvent(touch); + d->deliverTouchEvent(touch); + // we consume all touch events ourselves to avoid duplicate + // mouse delivery by QtGui mouse synthesis + e->accept(); + return true; } break; case QEvent::TouchCancel: @@ -1798,7 +1827,10 @@ bool QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, QTouchEv // First check whether the parent wants to be a filter, // and if the parent accepts the event we are done. if (sendFilteredTouchEvent(item->parentItem(), item, event)) { - event->accept(); + // If the touch was accepted (regardless by whom or in what form), + // update acceptedNewPoints + foreach (int id, matchingNewPoints) + acceptedNewPoints->insert(id); return true; } @@ -2303,6 +2335,8 @@ void QQuickWindowPrivate::cleanupNodesOnShutdown(QQuickItem *item) p->groupNode = 0; p->paintNode = 0; + + p->dirty(QQuickItemPrivate::Window); } for (int ii = 0; ii < p->childItems.count(); ++ii) |