diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2016-07-29 14:09:00 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-08-02 10:35:47 +0000 |
commit | e611c00d8c73f0aae77920646db88c09f0f880fa (patch) | |
tree | 4ef727cef316a9712cb970eec11b4d7f3b6a2e93 /src/quick/items/qquickwindow.cpp | |
parent | 388b2c5b46365a12aea5aaab091f24314349a102 (diff) |
Stop copying mouse events when delivering them
Reduce allocations of events, just refill the local pos.
Change-Id: I2948faf0e302bff315e482f2c1432fe0def19bc5
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/quick/items/qquickwindow.cpp')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 0b3026c167..e08147d7b0 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -1622,56 +1622,57 @@ QMouseEvent *QQuickWindowPrivate::cloneMouseEvent(QMouseEvent *event, QPointF *t return me; } -bool QQuickWindowPrivate::deliverInitialMousePressEvent(QMouseEvent *event) +void QQuickWindowPrivate::deliverInitialMousePressEvent(QQuickPointerMouseEvent *event) { Q_Q(QQuickWindow); + QPointF scenePos = event->point(0)->scenePos(); - QVector<QQuickItem *> targets = pointerTargets(contentItem, event->windowPos(), true); + QVector<QQuickItem *> targets = pointerTargets(contentItem, scenePos, true); for (QQuickItem *item: qAsConst(targets)) { QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); if (itemPrivate->acceptedMouseButtons() & event->button()) { - QPointF localPos = item->mapFromScene(event->windowPos()); + QPointF localPos = item->mapFromScene(scenePos); if (item->contains(localPos)) { - QScopedPointer<QMouseEvent> me(cloneMouseEvent(event, &localPos)); + QMouseEvent *me = event->asMouseEvent(localPos); me->accept(); - q->sendEvent(item, me.data()); - event->setAccepted(me->isAccepted()); + q->sendEvent(item, me); if (me->isAccepted()) { if (!q->mouseGrabberItem()) item->grabMouse(); - return true; + return; } } } } - return false; + // no item accepted the event, make sure we don't accept the original mouse event + event->asMouseEvent(QPointF())->setAccepted(false); } void QQuickWindowPrivate::deliverMouseEvent(QQuickPointerMouseEvent *pointerEvent) { Q_Q(QQuickWindow); - auto event = pointerEvent->asMouseEvent(); lastMousePosition = pointerEvent->point(0)->scenePos(); QQuickItem *mouseGrabberItem = q->mouseGrabberItem(); if (mouseGrabberItem) { // send update - QPointF localPos = mouseGrabberItem->mapFromScene(event->windowPos()); - QScopedPointer<QMouseEvent> me(cloneMouseEvent(event, &localPos)); + QPointF localPos = mouseGrabberItem->mapFromScene(lastMousePosition); + auto me = pointerEvent->asMouseEvent(localPos); me->accept(); - q->sendEvent(mouseGrabberItem, me.data()); - event->setAccepted(me->isAccepted()); + q->sendEvent(mouseGrabberItem, me); + pointerEvent->point(0)->setAccepted(me->isAccepted()); // release event, make sure to ungrab if there still is a grabber - if (event->type() == QEvent::MouseButtonRelease && !event->buttons() && q->mouseGrabberItem()) + if (me->type() == QEvent::MouseButtonRelease && !me->buttons() && q->mouseGrabberItem()) q->mouseGrabberItem()->ungrabMouse(); } else { // send initial press - event->setAccepted(false); if (pointerEvent->isPressEvent()) { - bool delivered = deliverInitialMousePressEvent(event); - event->setAccepted(delivered); + deliverInitialMousePressEvent(pointerEvent); + } else { + // make sure not to accept unhandled events + pointerEvent->asMouseEvent(QPointF())->setAccepted(false); } } } |