diff options
author | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-08-29 20:43:20 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-09-01 09:54:12 +0200 |
commit | 056a150bd4fb0aa44488e02002136277ee8e5ed6 (patch) | |
tree | 703edd7f95db371122aeacb97fd81bdaac04b333 | |
parent | e1b83432c1ea27f8028fd63fe9bc328f6e8b63a9 (diff) |
Fix touch with Weston
Work around the missing touch_frame after the last touch_up.
Task-number: QTBUG-36602
Change-Id: Iccb03bdc8b430c7cefc097c3c84e50be676c7fe7
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
-rw-r--r-- | src/client/qwaylandinputdevice.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp index 6c1320102..4a100f79a 100644 --- a/src/client/qwaylandinputdevice.cpp +++ b/src/client/qwaylandinputdevice.cpp @@ -220,6 +220,8 @@ public: void touch_frame() Q_DECL_OVERRIDE; void touch_cancel() Q_DECL_OVERRIDE; + bool allTouchPointsReleased(); + QWaylandInputDevice *mParent; QWaylandWindow *mFocus; QList<QWindowSystemInterface::TouchPoint> mTouchPoints; @@ -863,6 +865,13 @@ void QWaylandInputDevice::Touch::touch_up(uint32_t serial, uint32_t time, int32_ Q_UNUSED(time); mFocus = 0; mParent->handleTouchPoint(id, 0, 0, Qt::TouchPointReleased); + + // As of Weston 1.5.90 there is no touch_frame after the last touch_up + // (i.e. when the last finger is released). To accommodate for this, issue a + // touch_frame. This cannot hurt since it is safe to call the touch_frame + // handler multiple times when there are no points left. + if (allTouchPointsReleased()) + touch_frame(); } void QWaylandInputDevice::Touch::touch_motion(uint32_t time, int32_t id, wl_fixed_t x, wl_fixed_t y) @@ -921,6 +930,15 @@ void QWaylandInputDevice::handleTouchPoint(int id, double x, double y, Qt::Touch mTouch->mTouchPoints.append(tp); } +bool QWaylandInputDevice::Touch::allTouchPointsReleased() +{ + for (int i = 0; i < mTouchPoints.count(); ++i) + if (mTouchPoints.at(i).state != Qt::TouchPointReleased) + return false; + + return true; +} + void QWaylandInputDevice::Touch::touch_frame() { // Copy all points, that are in the previous but not in the current list, as stationary. @@ -950,13 +968,7 @@ void QWaylandInputDevice::Touch::touch_frame() QWindowSystemInterface::handleTouchEvent(window, mParent->mTouchDevice, mTouchPoints); - bool allReleased = true; - for (int i = 0; i < mTouchPoints.count(); ++i) - if (mTouchPoints.at(i).state != Qt::TouchPointReleased) { - allReleased = false; - break; - } - + const bool allReleased = allTouchPointsReleased(); mPrevTouchPoints = mTouchPoints; mTouchPoints.clear(); |