Revert "Add grabber context pointers"

This reverts commit 40330b8f0a717098982d1f54f34a18a8262b1f55.
It was a bad idea to use QFlatMap here, because it is a sorted map, but
we need to keep the passive grabbers in the same order as the grabs happened.
So need to go back to an earlier version of the patch that uses two parallel QLists.

Change-Id: I9e6013c2565986fe1eb9fd754f8259766f83bee5
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 2ecd0f4194dd23dd0917df81007c933cfcd4e6a5)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Shawn Rutledge 2021-04-29 12:03:36 +02:00 committed by Qt Cherry-pick Bot
parent a9ef91537b
commit 2afad7c8ee
5 changed files with 13 additions and 18 deletions

View File

@ -400,7 +400,7 @@ QList<QPointer<QObject> > QPointerEvent::passiveGrabbers(const QEventPoint &poin
qWarning() << "point is not in activePoints" << point;
return {};
}
return persistentPoint->passiveGrabbers.keys();
return persistentPoint->passiveGrabbers;
}
/*!

View File

@ -504,8 +504,6 @@ void QPointingDevicePrivate::setExclusiveGrabber(const QPointerEvent *event, con
QMutableEventPoint::from(persistentPoint->eventPoint).setGlobalGrabPosition(point.globalPosition());
if (exclusiveGrabber)
emit q->grabChanged(exclusiveGrabber, QPointingDevice::GrabExclusive, event, point);
else
persistentPoint->exclusiveGrabberContext.clear();
}
/*!
@ -538,7 +536,7 @@ bool QPointingDevicePrivate::addPassiveGrabber(const QPointerEvent *event, const
qCDebug(lcPointerGrab) << name << "point" << point.id() << point.state()
<< ": grab (passive)" << grabber;
}
persistentPoint->passiveGrabbers.insert(grabber, {});
persistentPoint->passiveGrabbers << grabber;
emit q->grabChanged(grabber, QPointingDevice::GrabPassive, event, point);
return true;
}
@ -551,14 +549,14 @@ bool QPointingDevicePrivate::removePassiveGrabber(const QPointerEvent *event, co
qWarning() << "point is not in activePoints" << point;
return false;
}
auto pgit = persistentPoint->passiveGrabbers.find(grabber);
if (pgit != persistentPoint->passiveGrabbers.end()) {
int i = persistentPoint->passiveGrabbers.indexOf(grabber);
if (i >= 0) {
if (Q_UNLIKELY(lcPointerGrab().isDebugEnabled())) {
qCDebug(lcPointerGrab) << name << "point" << point.id() << point.state()
<< ": removing passive grabber" << grabber;
}
emit q->grabChanged(grabber, QPointingDevice::UngrabPassive, event, point);
persistentPoint->passiveGrabbers.erase(pgit);
persistentPoint->passiveGrabbers.removeAt(i);
return true;
}
return false;
@ -576,9 +574,9 @@ void QPointingDevicePrivate::clearPassiveGrabbers(const QPointerEvent *event, co
return;
if (Q_UNLIKELY(lcPointerGrab().isDebugEnabled())) {
qCDebug(lcPointerGrab) << name << "point" << point.id() << point.state()
<< ": clearing" << persistentPoint->passiveGrabbers.keys();
<< ": clearing" << persistentPoint->passiveGrabbers;
}
for (auto g : persistentPoint->passiveGrabbers.keys())
for (auto g : persistentPoint->passiveGrabbers)
emit q->grabChanged(g, QPointingDevice::UngrabPassive, event, point);
persistentPoint->passiveGrabbers.clear();
}
@ -604,16 +602,15 @@ void QPointingDevicePrivate::removeGrabber(QObject *grabber, bool cancel)
<< "@" << epd.eventPoint.scenePosition()
<< ": grab" << grabber << "-> nullptr";
epd.exclusiveGrabber.clear();
epd.exclusiveGrabberContext.clear();
emit q->grabChanged(grabber,
cancel ? QPointingDevice::CancelGrabExclusive : QPointingDevice::UngrabExclusive,
nullptr, epd.eventPoint);
}
auto pgit = epd.passiveGrabbers.find(grabber);
if (pgit != epd.passiveGrabbers.end()) {
int pi = epd.passiveGrabbers.indexOf(grabber);
if (pi >= 0) {
qCDebug(lcPointerGrab) << name << "point" << epd.eventPoint.id() << epd.eventPoint.state()
<< ": removing passive grabber" << grabber;
epd.passiveGrabbers.erase(pgit);
epd.passiveGrabbers.removeAt(pi);
emit q->grabChanged(grabber,
cancel ? QPointingDevice::CancelGrabPassive : QPointingDevice::UngrabPassive,
nullptr, epd.eventPoint);

View File

@ -85,12 +85,10 @@ public:
/*! \internal
This struct (stored in activePoints) holds persistent state between event deliveries.
*/
using PassiveGrabbersMap = QFlatMap<QPointer<QObject>, QPointer<QObject>>;
struct EventPointData {
QEventPoint eventPoint;
QPointer<QObject> exclusiveGrabber;
QPointer<QObject> exclusiveGrabberContext; // extra info about where the grab happened
PassiveGrabbersMap passiveGrabbers; // key: passive grabber; value: context (where the grab happened)
QList<QPointer <QObject> > passiveGrabbers;
};
EventPointData *queryPointById(int id) const;
EventPointData *pointById(int id) const;

View File

@ -290,7 +290,7 @@ void tst_QMouseEvent::grabbers()
QCOMPARE(firstEPD->exclusiveGrabber, grabExclusive ? testMouseWidget : nullptr);
QCOMPARE(firstEPD->passiveGrabbers.count(), grabPassive ? 1 : 0);
if (grabPassive)
QCOMPARE(firstEPD->passiveGrabbers.keys().first(), testMouseWidget);
QCOMPARE(firstEPD->passiveGrabbers.first(), testMouseWidget);
// Ensure that grabbers are forgotten after release delivery
QTest::mouseRelease(testMouseWidget, Qt::LeftButton, Qt::KeyboardModifiers(), {10, 10});

View File

@ -1949,7 +1949,7 @@ void tst_QTouchEvent::grabbers()
QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, grabExclusive ? &w : nullptr);
QCOMPARE(devPriv->pointById(0)->passiveGrabbers.count(), grabPassive ? 1 : 0);
if (grabPassive)
QCOMPARE(devPriv->pointById(0)->passiveGrabbers.keys().first(), &w);
QCOMPARE(devPriv->pointById(0)->passiveGrabbers.first(), &w);
// Ensure that eventpoints are forgotten after release delivery
points.first().state = QEventPoint::State::Released;