From 7f0380c5d78573ee155cda3b510a05c252555db4 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Tue, 12 Dec 2023 12:25:11 +0100 Subject: [PATCH] Examples: fix touch handling in painting examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On macOS, we don't deliver a press event for the first press on the track pad (Qt::WA_TouchPadAcceptSingleTouchEvents is not set by default, so Qt doesn't deliver a single-press on the track pad as a touch event - that makes some sense or at least maintains compatibility). Because of that, point 0 is never added to the finger-mapping hash. When point 0 is then released, we didn't check if we found a valid iterator for that point ID, and the example crashed. Fix this by checking that we have a valid iterator before dereferencing, and by handling Stationary events in the same way as pressed (add the point to the mapping if it's not already there). Fixes: QTBUG-110266 Change-Id: I32337b801aaabf9b821a97ddc15ad78747b5e6a2 Reviewed-by: Jan Arve Sæther (cherry picked from commit 9d8473cdf63537dee65e9c235249b4e4901baa1a) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 7378c709f527749493bc15e66a566e1bdfc09fd3) (cherry picked from commit acfe26b16786c5e291c1ed8f3b39aefb119c4915) --- examples/widgets/painting/shared/hoverpoints.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/widgets/painting/shared/hoverpoints.cpp b/examples/widgets/painting/shared/hoverpoints.cpp index a9f76084e19..3bc1178ff0e 100644 --- a/examples/widgets/painting/shared/hoverpoints.cpp +++ b/examples/widgets/painting/shared/hoverpoints.cpp @@ -131,6 +131,7 @@ bool HoverPoints::eventFilter(QObject *object, QEvent *event) const int id = point.id(); switch (point.state()) { case QEventPoint::Pressed: + case QEventPoint::Stationary: { // find the point, move it const auto mappedPoints = m_fingerPointMapping.values(); @@ -155,7 +156,7 @@ bool HoverPoints::eventFilter(QObject *object, QEvent *event) } } if (activePoint != -1) { - m_fingerPointMapping.insert(point.id(), activePoint); + m_fingerPointMapping.insert(id, activePoint); movePoint(activePoint, point.position()); } } @@ -164,8 +165,10 @@ bool HoverPoints::eventFilter(QObject *object, QEvent *event) { // move the point and release const auto it = m_fingerPointMapping.constFind(id); - movePoint(it.value(), point.position()); - m_fingerPointMapping.erase(it); + if (it != m_fingerPointMapping.constEnd()) { + movePoint(it.value(), point.position()); + m_fingerPointMapping.erase(it); + } } break; case QEventPoint::Updated: