Use QVarLengthFlatMap for QPointingDevicePrivate::activePoints
It's good to use a pre-allocated set of points that never changes,
because queryPointById() returns a pointer to the stored instance.
If the flatmap's values are in a QList, and a mouse event comes in at
the wrong time while touchpoints are already stored there, causing
the QList to be resized, the returned pointer can become garbage.
The pointer returned from queryPointById() is never retained for long,
but in practice it turned out this could still happen, at least on X11
(perhaps because of X11 synthesizing mouse events from touch).
Using a pre-allocated QVarLengthFlatMap is also an optimization: events
on single-user systems are unlikely to ever cause memory allocation in
this part of the code.
Many touchscreens support up to 10 touchpoints, but the user might
have some other input devices, plus the "core pointer" (mouse).
The user could also have two touchscreens and try to use them
simultaneously.
d4611ba3a5
added QVarLengthFlatMap along
with a test using int keys; so we expect that will keep working now.
There was some issue in 2020 which is why I didn't use QVarLengthArray
for the QFlatMap key and value containers to begin with.
Pick-to: 6.2 6.3 6.4 6.4.0
Fixes: QTBUG-106223
Change-Id: I588f66f07126b9551937a369df44f045759b473d
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
parent
3dff397284
commit
83e70c3157
@ -465,6 +465,7 @@ void QPointingDevicePrivate::setExclusiveGrabber(const QPointerEvent *event, con
|
||||
qWarning() << "point is not in activePoints" << point;
|
||||
return;
|
||||
}
|
||||
Q_ASSERT(persistentPoint->eventPoint.id() == point.id());
|
||||
if (persistentPoint->exclusiveGrabber == exclusiveGrabber)
|
||||
return;
|
||||
auto oldGrabber = persistentPoint->exclusiveGrabber;
|
||||
|
@ -72,7 +72,7 @@ public:
|
||||
void clearPassiveGrabbers(const QPointerEvent *event, const QEventPoint &point);
|
||||
void removeGrabber(QObject *grabber, bool cancel = false);
|
||||
|
||||
using EventPointMap = QFlatMap<int, EventPointData>;
|
||||
using EventPointMap = QVarLengthFlatMap<int, EventPointData, 20>;
|
||||
mutable EventPointMap activePoints;
|
||||
|
||||
QPointingDeviceUniqueId uniqueId;
|
||||
|
Loading…
Reference in New Issue
Block a user