summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qevent.cpp2
-rw-r--r--src/gui/kernel/qpointingdevice.cpp21
-rw-r--r--src/gui/kernel/qpointingdevice_p.h4
-rw-r--r--tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp2
-rw-r--r--tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp2
5 files changed, 18 insertions, 13 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index adc1029754..b5418347b4 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -400,7 +400,7 @@ QList<QPointer<QObject> > QPointerEvent::passiveGrabbers(const QEventPoint &poin
qWarning() << "point is not in activePoints" << point;
return {};
}
- return persistentPoint->passiveGrabbers;
+ return persistentPoint->passiveGrabbers.keys();
}
/*!
diff --git a/src/gui/kernel/qpointingdevice.cpp b/src/gui/kernel/qpointingdevice.cpp
index 6ef032098f..58f318f2f9 100644
--- a/src/gui/kernel/qpointingdevice.cpp
+++ b/src/gui/kernel/qpointingdevice.cpp
@@ -504,6 +504,8 @@ 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();
}
/*!
@@ -536,7 +538,7 @@ bool QPointingDevicePrivate::addPassiveGrabber(const QPointerEvent *event, const
qCDebug(lcPointerGrab) << name << "point" << point.id() << point.state()
<< ": grab (passive)" << grabber;
}
- persistentPoint->passiveGrabbers << grabber;
+ persistentPoint->passiveGrabbers.insert(grabber, {});
emit q->grabChanged(grabber, QPointingDevice::GrabPassive, event, point);
return true;
}
@@ -549,14 +551,14 @@ bool QPointingDevicePrivate::removePassiveGrabber(const QPointerEvent *event, co
qWarning() << "point is not in activePoints" << point;
return false;
}
- int i = persistentPoint->passiveGrabbers.indexOf(grabber);
- if (i >= 0) {
+ auto pgit = persistentPoint->passiveGrabbers.find(grabber);
+ if (pgit != persistentPoint->passiveGrabbers.end()) {
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.removeAt(i);
+ persistentPoint->passiveGrabbers.erase(pgit);
return true;
}
return false;
@@ -574,9 +576,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;
+ << ": clearing" << persistentPoint->passiveGrabbers.keys();
}
- for (auto g : persistentPoint->passiveGrabbers)
+ for (auto g : persistentPoint->passiveGrabbers.keys())
emit q->grabChanged(g, QPointingDevice::UngrabPassive, event, point);
persistentPoint->passiveGrabbers.clear();
}
@@ -602,15 +604,16 @@ 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);
}
- int pi = epd.passiveGrabbers.indexOf(grabber);
- if (pi >= 0) {
+ auto pgit = epd.passiveGrabbers.find(grabber);
+ if (pgit != epd.passiveGrabbers.end()) {
qCDebug(lcPointerGrab) << name << "point" << epd.eventPoint.id() << epd.eventPoint.state()
<< ": removing passive grabber" << grabber;
- epd.passiveGrabbers.removeAt(pi);
+ epd.passiveGrabbers.erase(pgit);
emit q->grabChanged(grabber,
cancel ? QPointingDevice::CancelGrabPassive : QPointingDevice::UngrabPassive,
nullptr, epd.eventPoint);
diff --git a/src/gui/kernel/qpointingdevice_p.h b/src/gui/kernel/qpointingdevice_p.h
index 645c82673b..0198b0d142 100644
--- a/src/gui/kernel/qpointingdevice_p.h
+++ b/src/gui/kernel/qpointingdevice_p.h
@@ -85,10 +85,12 @@ 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;
- QList<QPointer <QObject> > passiveGrabbers;
+ QPointer<QObject> exclusiveGrabberContext; // extra info about where the grab happened
+ PassiveGrabbersMap passiveGrabbers; // key: passive grabber; value: context (where the grab happened)
};
EventPointData *queryPointById(int id) const;
EventPointData *pointById(int id) const;
diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
index d5174e0942..cdf11ec54a 100644
--- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
+++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
@@ -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.first(), testMouseWidget);
+ QCOMPARE(firstEPD->passiveGrabbers.keys().first(), testMouseWidget);
// Ensure that grabbers are forgotten after release delivery
QTest::mouseRelease(testMouseWidget, Qt::LeftButton, Qt::KeyboardModifiers(), {10, 10});
diff --git a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp
index 28c33e8226..fa3f495c23 100644
--- a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp
+++ b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp
@@ -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.first(), &w);
+ QCOMPARE(devPriv->pointById(0)->passiveGrabbers.keys().first(), &w);
// Ensure that eventpoints are forgotten after release delivery
points.first().state = QEventPoint::State::Released;