From ccf01c46ab947c04f3d523d29371cec087d7b124 Mon Sep 17 00:00:00 2001
From: Pavel Tumakaev
Date: Tue, 1 Mar 2022 19:05:44 +0300
Subject: [PATCH] [qtmozembed] Prevent touch event coordinates fluctuation.
Fixes JB#57776
Scrolling pages in the browser on slow devices periodically spontaneously
changes direction. Dropping points whose arrival interval is less than 2 ms
solves this problem.
---
src/qmozview_p.cpp | 13 ++++++++-----
src/qmozview_p.h | 3 ++-
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/qmozview_p.cpp b/src/qmozview_p.cpp
index 71f86fd..ce76f9c 100644
--- a/src/qmozview_p.cpp
+++ b/src/qmozview_p.cpp
@@ -1361,11 +1361,11 @@ void QMozViewPrivate::touchEvent(QTouchEvent *event)
// Add active touch point to cancelled touch sequence.
if (event->type() == QEvent::TouchCancel && touchPointsCount == 0) {
- QMapIterator i(mActiveTouchPoints);
+ QMapIterator> i(mActiveTouchPoints);
EmbedTouchInput touchEnd(EmbedTouchInput::MULTITOUCH_END, timeStamp);
while (i.hasNext()) {
i.next();
- QPointF pos = i.value();
+ QPointF pos = i.value().first;
touchEnd.touches.push_back(TouchData(i.key(),
createEmbedTouchPoint(pos),
0));
@@ -1384,7 +1384,7 @@ void QMozViewPrivate::touchEvent(QTouchEvent *event)
idHash.insert(pt.id(), i);
switch (pt.state()) {
case Qt::TouchPointPressed: {
- mActiveTouchPoints.insert(pt.id(), pt.pos());
+ mActiveTouchPoints.insert(pt.id(), {pt.pos(), event->timestamp()});
pressedIds.append(pt.id());
break;
}
@@ -1395,8 +1395,11 @@ void QMozViewPrivate::touchEvent(QTouchEvent *event)
}
case Qt::TouchPointMoved:
case Qt::TouchPointStationary: {
- mActiveTouchPoints.insert(pt.id(), pt.pos());
- moveIds.append(pt.id());
+ QMap>::const_iterator i = mActiveTouchPoints.find(pt.id());
+ if (i == mActiveTouchPoints.end() || (event->timestamp() - i.value().second) > 1) {
+ mActiveTouchPoints.insert(pt.id(), {pt.pos(), event->timestamp()});
+ moveIds.append(pt.id());
+ }
break;
}
default:
diff --git a/src/qmozview_p.h b/src/qmozview_p.h
index 88afe20..764ee30 100644
--- a/src/qmozview_p.h
+++ b/src/qmozview_p.h
@@ -202,7 +202,8 @@ public Q_SLOTS:
QPointF mLastPos;
QPointF mSecondLastPos;
QPointF mLastStationaryPos;
- QMap mActiveTouchPoints;
+ // >
+ QMap> mActiveTouchPoints;
bool mCanFlick;
bool mPendingTouchEvent;
QString mUrl;