macOS: Sanitize scroll deltas for NSEventPhaseCancelled

On macOS 12.1 the NSEventPhaseCancelled phase can in some situations
report deltas, which causes the scroll to "jump". This happens for
example when initiating a momentum-scroll, and then putting two
fingers on the trackpad to cancel the momentum phase, which starts
a new NSEventPhaseMayBegin phase. When then lifting the two fingers
again, we get an NSEventPhaseCancelled event with deltas, but the
deltas seem like uninitialized data (has a x-value, after doing
a purely vertical scroll e.g.).

Task-number: QTBUG-97841
Pick-to: 6.3 6.2 5.15
Change-Id: I14e765b6111e53e7d3d0da219d4ac7fefe5243d0
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Tor Arne Vestbø 2021-12-23 14:26:35 +01:00
parent a7b70ee55b
commit 2c3198ab5f

View File

@ -733,6 +733,16 @@ static const QPointingDevice *pointingDeviceFor(qint64 deviceID)
Q_ASSERT(theEvent.momentumPhase != NSEventPhaseStationary);
}
// Sanitize deltas for events that should not result in scrolling.
// On macOS 12.1 this phase has been observed to report deltas.
if (theEvent.phase == NSEventPhaseCancelled) {
if (!pixelDelta.isNull() || !angleDelta.isNull()) {
qCInfo(lcQpaMouse) << "Ignoring unexpected delta for" << theEvent;
pixelDelta = QPoint();
angleDelta = QPoint();
}
}
// Prevent keyboard modifier state from changing during scroll event streams.
// A two-finger trackpad flick generates a stream of scroll events. We want
// the keyboard modifier state to be the state at the beginning of the