Fix TouchPoint::lastPos() after TouchPointStationary only events.
authorJocelyn Turcotte <jocelyn.turcotte@nokia.com>
Mon, 17 Oct 2011 12:45:45 +0000 (14:45 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 17 Oct 2011 16:03:13 +0000 (18:03 +0200)
lastPos is copied from the last point's position, and the position has
to be resolved according the the receiving item's transformation.

However, if a QTouchEvent contains only stationary points, it won't be
delivered, it's pos()/rect() will still be uninitialized, and the
touch point of the next event will be delivered with the uninitialized
pos() as it's lastPos().

This patch makes sure that the lastPos() won't be filled with a
previous incomplete stationary point state even if the platform is
sending us stationary-point-only touch events.

Change-Id: Ia7d10423c8fbe78348edbb0a89fbfa66d1b8b5d1
Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com>
src/gui/kernel/qguiapplication.cpp

index e4216a6..a16685e 100644 (file)
@@ -850,7 +850,11 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To
             touchPoint.d->lastNormalizedPos = previousTouchPoint.normalizedPos();
             if (touchPoint.pressure() < qreal(0.))
                 touchPoint.d->pressure = qreal(1.);
-            d->appCurrentTouchPoints[touchPoint.id()] = touchPoint;
+
+            // Stationary points might not be delivered down to the receiving item
+            // and get their position transformed, keep the old values instead.
+            if (touchPoint.state() != Qt::TouchPointStationary)
+                d->appCurrentTouchPoints[touchPoint.id()] = touchPoint;
             break;
         }