Combine device and point id into 32 bit point id

This allows us to not have conflicts between the point ids between
different devices for QtQuick pointer handlers.

We do this in QtGui because we can then safely compare point ids from
QTouchEvent::TouchPoint and QQuickEventPoint.

(Point ids that QtQuick pointer handlers use will be based on the point
ids provided by QTouchEvent::TouchPoint::id)

Change-Id: I8b9ab0d44224b15175b820d33cbb2d8bd21e99f2
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
Jan Arve Saether 2016-08-23 10:44:20 +02:00 committed by Shawn Rutledge
parent e6d0d202f3
commit cd26e66c2e
6 changed files with 185 additions and 15 deletions

View File

@ -84,6 +84,7 @@
#include "private/qcursor_p.h" #include "private/qcursor_p.h"
#include "private/qopenglcontext_p.h" #include "private/qopenglcontext_p.h"
#include "private/qinputdevicemanager_p.h" #include "private/qinputdevicemanager_p.h"
#include "private/qtouchdevice_p.h"
#include "private/qdnd_p.h" #include "private/qdnd_p.h"
#include <qpa/qplatformthemefactory_p.h> #include <qpa/qplatformthemefactory_p.h>
@ -1944,7 +1945,8 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo
points << point; points << point;
QEvent::Type type; QEvent::Type type;
QList<QTouchEvent::TouchPoint> touchPoints = QWindowSystemInterfacePrivate::fromNativeTouchPoints(points, window, &type); QList<QTouchEvent::TouchPoint> touchPoints =
QWindowSystemInterfacePrivate::fromNativeTouchPoints(points, window, QTouchDevicePrivate::get(m_fakeTouchDevice)->id, &type);
QWindowSystemInterfacePrivate::TouchEvent fake(window, e->timestamp, type, m_fakeTouchDevice, touchPoints, e->modifiers); QWindowSystemInterfacePrivate::TouchEvent fake(window, e->timestamp, type, m_fakeTouchDevice, touchPoints, e->modifiers);
fake.flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic; fake.flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic;

View File

@ -87,6 +87,7 @@ public:
private: private:
QTouchDevicePrivate *d; QTouchDevicePrivate *d;
friend class QTouchDevicePrivate;
}; };
Q_DECLARE_OPERATORS_FOR_FLAGS(QTouchDevice::Capabilities) Q_DECLARE_OPERATORS_FOR_FLAGS(QTouchDevice::Capabilities)

View File

@ -64,16 +64,21 @@ public:
: type(QTouchDevice::TouchScreen), : type(QTouchDevice::TouchScreen),
caps(QTouchDevice::Position), caps(QTouchDevice::Position),
maxTouchPoints(1) maxTouchPoints(1)
{ } {
static quint8 nextId = 2; // device 0 is not used, device 1 is for mouse device
id = nextId++;
}
QTouchDevice::DeviceType type; QTouchDevice::DeviceType type;
QTouchDevice::Capabilities caps; QTouchDevice::Capabilities caps;
QString name; QString name;
int maxTouchPoints; int maxTouchPoints;
quint8 id;
static void registerDevice(const QTouchDevice *dev); static void registerDevice(const QTouchDevice *dev);
static void unregisterDevice(const QTouchDevice *dev); static void unregisterDevice(const QTouchDevice *dev);
static bool isRegistered(const QTouchDevice *dev); static bool isRegistered(const QTouchDevice *dev);
static QTouchDevicePrivate *get(QTouchDevice *q) { return q->d; }
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -460,9 +460,40 @@ void QWindowSystemInterface::handleTouchEvent(QWindow *w, QTouchDevice *device,
handleTouchEvent(w, time, device, points, mods); handleTouchEvent(w, time, device, points, mods);
} }
static int g_nextPointId = 1;
// map from device-independent point id (arbitrary) to "Qt point" ids
typedef QMap<quint64, int> PointIdMap;
Q_GLOBAL_STATIC(PointIdMap, g_pointIdMap)
/*!
This function maps potentially arbitrary point ids \a pointId in the 32 bit
value space to start from 1 and increase incrementally for each touch point
held down. If all touch points are released it will reset the id back to 1
for the following touch point.
We can then assume that the touch points ids will never become too large,
and it will then put the device identifier \a deviceId in the upper 8 bits.
This leaves us with max 255 devices, and 16.7M taps without full release
before we run out of value space.
*/
static int acquireCombinedPointId(quint8 deviceId, int pointId)
{
quint64 combinedId64 = (quint64(deviceId) << 32) + pointId;
auto it = g_pointIdMap->constFind(combinedId64);
int uid;
if (it == g_pointIdMap->constEnd()) {
uid = g_nextPointId++;
g_pointIdMap->insert(combinedId64, uid);
} else {
uid = *it;
}
return (deviceId << 24) + uid;
}
QList<QTouchEvent::TouchPoint> QList<QTouchEvent::TouchPoint>
QWindowSystemInterfacePrivate::fromNativeTouchPoints(const QList<QWindowSystemInterface::TouchPoint> &points, QWindowSystemInterfacePrivate::fromNativeTouchPoints(const QList<QWindowSystemInterface::TouchPoint> &points,
const QWindow *window, const QWindow *window, quint8 deviceId,
QEvent::Type *type) QEvent::Type *type)
{ {
QList<QTouchEvent::TouchPoint> touchPoints; QList<QTouchEvent::TouchPoint> touchPoints;
@ -473,7 +504,7 @@ QList<QTouchEvent::TouchPoint>
QList<QWindowSystemInterface::TouchPoint>::const_iterator point = points.constBegin(); QList<QWindowSystemInterface::TouchPoint>::const_iterator point = points.constBegin();
QList<QWindowSystemInterface::TouchPoint>::const_iterator end = points.constEnd(); QList<QWindowSystemInterface::TouchPoint>::const_iterator end = points.constEnd();
while (point != end) { while (point != end) {
p.setId(point->id); p.setId(acquireCombinedPointId(deviceId, point->id));
if (point->uniqueId >= 0) if (point->uniqueId >= 0)
p.setUniqueId(point->uniqueId); p.setUniqueId(point->uniqueId);
p.setPressure(point->pressure); p.setPressure(point->pressure);
@ -506,6 +537,11 @@ QList<QTouchEvent::TouchPoint>
*type = QEvent::TouchEnd; *type = QEvent::TouchEnd;
} }
if (states == Qt::TouchPointReleased) {
g_nextPointId = 1;
g_pointIdMap->clear();
}
return touchPoints; return touchPoints;
} }
@ -540,7 +576,8 @@ void QWindowSystemInterface::handleTouchEvent(QWindow *tlw, ulong timestamp, QTo
return; return;
QEvent::Type type; QEvent::Type type;
QList<QTouchEvent::TouchPoint> touchPoints = QWindowSystemInterfacePrivate::fromNativeTouchPoints(points, tlw, &type); QList<QTouchEvent::TouchPoint> touchPoints =
QWindowSystemInterfacePrivate::fromNativeTouchPoints(points, tlw, QTouchDevicePrivate::get(device)->id, &type);
QWindowSystemInterfacePrivate::TouchEvent *e = QWindowSystemInterfacePrivate::TouchEvent *e =
new QWindowSystemInterfacePrivate::TouchEvent(tlw, timestamp, type, device, touchPoints, mods); new QWindowSystemInterfacePrivate::TouchEvent(tlw, timestamp, type, device, touchPoints, mods);

View File

@ -503,7 +503,7 @@ public:
static QList<QTouchEvent::TouchPoint> static QList<QTouchEvent::TouchPoint>
fromNativeTouchPoints(const QList<QWindowSystemInterface::TouchPoint> &points, fromNativeTouchPoints(const QList<QWindowSystemInterface::TouchPoint> &points,
const QWindow *window, QEvent::Type *type = Q_NULLPTR); const QWindow *window, quint8 deviceId, QEvent::Type *type = Q_NULLPTR);
static QList<QWindowSystemInterface::TouchPoint> static QList<QWindowSystemInterface::TouchPoint>
toNativeTouchPoints(const QList<QTouchEvent::TouchPoint>& pointList, toNativeTouchPoints(const QList<QTouchEvent::TouchPoint>& pointList,
const QWindow *window); const QWindow *window);

View File

@ -36,6 +36,7 @@
#include <qpa/qwindowsysteminterface.h> #include <qpa/qwindowsysteminterface.h>
#include <qpa/qwindowsysteminterface_p.h> #include <qpa/qwindowsysteminterface_p.h>
#include <private/qhighdpiscaling_p.h> #include <private/qhighdpiscaling_p.h>
#include <private/qtouchdevice_p.h>
class tst_QTouchEventWidget : public QWidget class tst_QTouchEventWidget : public QWidget
{ {
@ -199,6 +200,7 @@ private slots:
void touchBeginPropagatesWhenIgnored(); void touchBeginPropagatesWhenIgnored();
void touchUpdateAndEndNeverPropagate(); void touchUpdateAndEndNeverPropagate();
void basicRawEventTranslation(); void basicRawEventTranslation();
void basicRawEventTranslationOfIds();
void multiPointRawEventTranslationOnTouchScreen(); void multiPointRawEventTranslationOnTouchScreen();
void multiPointRawEventTranslationOnTouchPad(); void multiPointRawEventTranslationOnTouchPad();
void deleteInEventHandler(); void deleteInEventHandler();
@ -602,7 +604,8 @@ void tst_QTouchEvent::basicRawEventTranslation()
QCOMPARE(touchWidget.touchBeginPoints.count(), 1); QCOMPARE(touchWidget.touchBeginPoints.count(), 1);
QCOMPARE(touchWidget.timestamp, timestamp); QCOMPARE(touchWidget.timestamp, timestamp);
QTouchEvent::TouchPoint touchBeginPoint = touchWidget.touchBeginPoints.first(); QTouchEvent::TouchPoint touchBeginPoint = touchWidget.touchBeginPoints.first();
QCOMPARE(touchBeginPoint.id(), rawTouchPoint.id()); const int touchPointId = (QTouchDevicePrivate::get(touchScreenDevice)->id << 24) + 1;
QCOMPARE(touchBeginPoint.id(), touchPointId);
QCOMPARE(touchBeginPoint.state(), rawTouchPoint.state()); QCOMPARE(touchBeginPoint.state(), rawTouchPoint.state());
QCOMPARE(touchBeginPoint.pos(), pos); QCOMPARE(touchBeginPoint.pos(), pos);
QCOMPARE(touchBeginPoint.startPos(), pos); QCOMPARE(touchBeginPoint.startPos(), pos);
@ -637,7 +640,7 @@ void tst_QTouchEvent::basicRawEventTranslation()
QVERIFY(!touchWidget.seenTouchEnd); QVERIFY(!touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchUpdatePoints.count(), 1); QCOMPARE(touchWidget.touchUpdatePoints.count(), 1);
QTouchEvent::TouchPoint touchUpdatePoint = touchWidget.touchUpdatePoints.first(); QTouchEvent::TouchPoint touchUpdatePoint = touchWidget.touchUpdatePoints.first();
QCOMPARE(touchUpdatePoint.id(), rawTouchPoint.id()); QCOMPARE(touchUpdatePoint.id(), touchPointId);
QCOMPARE(touchUpdatePoint.state(), rawTouchPoint.state()); QCOMPARE(touchUpdatePoint.state(), rawTouchPoint.state());
QCOMPARE(touchUpdatePoint.pos(), pos + delta); QCOMPARE(touchUpdatePoint.pos(), pos + delta);
QCOMPARE(touchUpdatePoint.startPos(), pos); QCOMPARE(touchUpdatePoint.startPos(), pos);
@ -669,7 +672,7 @@ void tst_QTouchEvent::basicRawEventTranslation()
QVERIFY(touchWidget.seenTouchEnd); QVERIFY(touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchEndPoints.count(), 1); QCOMPARE(touchWidget.touchEndPoints.count(), 1);
QTouchEvent::TouchPoint touchEndPoint = touchWidget.touchEndPoints.first(); QTouchEvent::TouchPoint touchEndPoint = touchWidget.touchEndPoints.first();
QCOMPARE(touchEndPoint.id(), rawTouchPoint.id()); QCOMPARE(touchEndPoint.id(), touchPointId);
QCOMPARE(touchEndPoint.state(), rawTouchPoint.state()); QCOMPARE(touchEndPoint.state(), rawTouchPoint.state());
QCOMPARE(touchEndPoint.pos(), pos + delta + delta); QCOMPARE(touchEndPoint.pos(), pos + delta + delta);
QCOMPARE(touchEndPoint.startPos(), pos); QCOMPARE(touchEndPoint.startPos(), pos);
@ -745,9 +748,11 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QVERIFY(!rightWidget.seenTouchEnd); QVERIFY(!rightWidget.seenTouchEnd);
QCOMPARE(leftWidget.touchBeginPoints.count(), 1); QCOMPARE(leftWidget.touchBeginPoints.count(), 1);
QCOMPARE(rightWidget.touchBeginPoints.count(), 1); QCOMPARE(rightWidget.touchBeginPoints.count(), 1);
const int touchPointId0 = (QTouchDevicePrivate::get(touchScreenDevice)->id << 24) + 1;
const int touchPointId1 = touchPointId0 + 1;
{ {
QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchBeginPoints.first(); QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchBeginPoints.first();
QCOMPARE(leftTouchPoint.id(), rawTouchPoints[0].id()); QCOMPARE(leftTouchPoint.id(), touchPointId0);
QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state()); QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state());
QCOMPARE(leftTouchPoint.pos(), leftPos); QCOMPARE(leftTouchPoint.pos(), leftPos);
QCOMPARE(leftTouchPoint.startPos(), leftPos); QCOMPARE(leftTouchPoint.startPos(), leftPos);
@ -767,7 +772,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QCOMPARE(leftTouchPoint.pressure(), qreal(1.)); QCOMPARE(leftTouchPoint.pressure(), qreal(1.));
QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchBeginPoints.first(); QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchBeginPoints.first();
QCOMPARE(rightTouchPoint.id(), rawTouchPoints[1].id()); QCOMPARE(rightTouchPoint.id(), touchPointId1);
QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state()); QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state());
QCOMPARE(rightTouchPoint.pos(), rightPos); QCOMPARE(rightTouchPoint.pos(), rightPos);
QCOMPARE(rightTouchPoint.startPos(), rightPos); QCOMPARE(rightTouchPoint.startPos(), rightPos);
@ -811,7 +816,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QCOMPARE(rightWidget.touchUpdatePoints.count(), 1); QCOMPARE(rightWidget.touchUpdatePoints.count(), 1);
{ {
QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchUpdatePoints.first(); QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchUpdatePoints.first();
QCOMPARE(leftTouchPoint.id(), rawTouchPoints[0].id()); QCOMPARE(leftTouchPoint.id(), touchPointId0);
QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state()); QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state());
QCOMPARE(leftTouchPoint.pos(), QPointF(leftWidget.mapFromParent(centerPos.toPoint()))); QCOMPARE(leftTouchPoint.pos(), QPointF(leftWidget.mapFromParent(centerPos.toPoint())));
QCOMPARE(leftTouchPoint.startPos(), leftPos); QCOMPARE(leftTouchPoint.startPos(), leftPos);
@ -831,7 +836,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QCOMPARE(leftTouchPoint.pressure(), qreal(1.)); QCOMPARE(leftTouchPoint.pressure(), qreal(1.));
QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchUpdatePoints.first(); QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchUpdatePoints.first();
QCOMPARE(rightTouchPoint.id(), rawTouchPoints[1].id()); QCOMPARE(rightTouchPoint.id(), touchPointId1);
QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state()); QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state());
QCOMPARE(rightTouchPoint.pos(), QPointF(rightWidget.mapFromParent(centerPos.toPoint()))); QCOMPARE(rightTouchPoint.pos(), QPointF(rightWidget.mapFromParent(centerPos.toPoint())));
QCOMPARE(rightTouchPoint.startPos(), rightPos); QCOMPARE(rightTouchPoint.startPos(), rightPos);
@ -875,7 +880,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QCOMPARE(rightWidget.touchEndPoints.count(), 1); QCOMPARE(rightWidget.touchEndPoints.count(), 1);
{ {
QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchEndPoints.first(); QTouchEvent::TouchPoint leftTouchPoint = leftWidget.touchEndPoints.first();
QCOMPARE(leftTouchPoint.id(), rawTouchPoints[0].id()); QCOMPARE(leftTouchPoint.id(), touchPointId0);
QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state()); QCOMPARE(leftTouchPoint.state(), rawTouchPoints[0].state());
QCOMPARE(leftTouchPoint.pos(), QPointF(leftWidget.mapFromParent(centerPos.toPoint()))); QCOMPARE(leftTouchPoint.pos(), QPointF(leftWidget.mapFromParent(centerPos.toPoint())));
QCOMPARE(leftTouchPoint.startPos(), leftPos); QCOMPARE(leftTouchPoint.startPos(), leftPos);
@ -895,7 +900,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
QCOMPARE(leftTouchPoint.pressure(), qreal(0.)); QCOMPARE(leftTouchPoint.pressure(), qreal(0.));
QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchEndPoints.first(); QTouchEvent::TouchPoint rightTouchPoint = rightWidget.touchEndPoints.first();
QCOMPARE(rightTouchPoint.id(), rawTouchPoints[1].id()); QCOMPARE(rightTouchPoint.id(), touchPointId1);
QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state()); QCOMPARE(rightTouchPoint.state(), rawTouchPoints[1].state());
QCOMPARE(rightTouchPoint.pos(), QPointF(rightWidget.mapFromParent(centerPos.toPoint()))); QCOMPARE(rightTouchPoint.pos(), QPointF(rightWidget.mapFromParent(centerPos.toPoint())));
QCOMPARE(rightTouchPoint.startPos(), rightPos); QCOMPARE(rightTouchPoint.startPos(), rightPos);
@ -1145,6 +1150,126 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
} }
} }
void tst_QTouchEvent::basicRawEventTranslationOfIds()
{
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
touchWidget.setGeometry(100, 100, 400, 300);
touchWidget.show();
QVERIFY(QTest::qWaitForWindowActive(&touchWidget));
QVarLengthArray<QPointF, 2> pos;
QVarLengthArray<QPointF, 2> screenPos;
for (int i = 0; i < 2; ++i) {
pos << touchWidget.rect().center() + QPointF(20*i, 20*i);
screenPos << touchWidget.mapToGlobal(pos[i].toPoint());
}
QPointF delta(10, 10);
QRectF screenGeometry = QApplication::desktop()->screenGeometry(&touchWidget);
QVector<QPointF> rawPosList;
rawPosList << QPointF(12, 34) << QPointF(56, 78);
QList<QTouchEvent::TouchPoint> rawTouchPoints;
// Press both points, this should be translated to a TouchBegin
for (int i = 0; i < 2; ++i) {
QTouchEvent::TouchPoint rawTouchPoint;
rawTouchPoint.setId(i);
rawTouchPoint.setState(Qt::TouchPointPressed);
rawTouchPoint.setScreenPos(screenPos[i]);
rawTouchPoint.setNormalizedPos(normalized(rawTouchPoint.pos(), screenGeometry));
rawTouchPoint.setRawScreenPositions(rawPosList);
rawTouchPoints << rawTouchPoint;
}
QTouchEvent::TouchPoint &p0 = rawTouchPoints[0];
QTouchEvent::TouchPoint &p1 = rawTouchPoints[1];
const ulong timestamp = 1234;
QWindow *window = touchWidget.windowHandle();
QList<QWindowSystemInterface::TouchPoint> nativeTouchPoints =
QWindowSystemInterfacePrivate::toNativeTouchPoints(rawTouchPoints, window);
QWindowSystemInterface::handleTouchEvent(window, timestamp, touchScreenDevice, nativeTouchPoints);
QCoreApplication::processEvents();
QVERIFY(touchWidget.seenTouchBegin);
QVERIFY(!touchWidget.seenTouchUpdate);
QVERIFY(!touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchBeginPoints.count(), 2);
const int initialTouchPointId = (QTouchDevicePrivate::get(touchScreenDevice)->id << 24) + 1;
for (int i = 0; i < touchWidget.touchBeginPoints.count(); ++i) {
QTouchEvent::TouchPoint touchBeginPoint = touchWidget.touchBeginPoints.at(i);
QCOMPARE(touchBeginPoint.id(), initialTouchPointId + i);
QCOMPARE(touchBeginPoint.state(), rawTouchPoints[i].state());
}
// moving the point should translate to TouchUpdate
for (int i = 0; i < rawTouchPoints.count(); ++i) {
QTouchEvent::TouchPoint &p = rawTouchPoints[i];
p.setState(Qt::TouchPointMoved);
p.setScreenPos(p.screenPos() + delta);
p.setNormalizedPos(normalized(p.pos(), screenGeometry));
}
nativeTouchPoints =
QWindowSystemInterfacePrivate::toNativeTouchPoints(rawTouchPoints, window);
QWindowSystemInterface::handleTouchEvent(window, 0, touchScreenDevice, nativeTouchPoints);
QCoreApplication::processEvents();
QVERIFY(touchWidget.seenTouchBegin);
QVERIFY(touchWidget.seenTouchUpdate);
QVERIFY(!touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchUpdatePoints.count(), 2);
QCOMPARE(touchWidget.touchUpdatePoints.at(0).id(), initialTouchPointId);
QCOMPARE(touchWidget.touchUpdatePoints.at(1).id(), initialTouchPointId + 1);
// release last point
p0.setState(Qt::TouchPointStationary);
p1.setState(Qt::TouchPointReleased);
nativeTouchPoints =
QWindowSystemInterfacePrivate::toNativeTouchPoints(rawTouchPoints, window);
QWindowSystemInterface::handleTouchEvent(window, 0, touchScreenDevice, nativeTouchPoints);
QCoreApplication::processEvents();
QVERIFY(touchWidget.seenTouchBegin);
QVERIFY(touchWidget.seenTouchUpdate);
QVERIFY(!touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchUpdatePoints.count(), 2);
QCOMPARE(touchWidget.touchUpdatePoints[0].id(), initialTouchPointId);
QCOMPARE(touchWidget.touchUpdatePoints[1].id(), initialTouchPointId + 1);
// Press last point again, id should increase
p1.setState(Qt::TouchPointPressed);
p1.setId(42); // new id
nativeTouchPoints =
QWindowSystemInterfacePrivate::toNativeTouchPoints(rawTouchPoints, window);
QWindowSystemInterface::handleTouchEvent(window, 0, touchScreenDevice, nativeTouchPoints);
QCoreApplication::processEvents();
QVERIFY(touchWidget.seenTouchBegin);
QVERIFY(touchWidget.seenTouchUpdate);
QVERIFY(!touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchUpdatePoints.count(), 2);
QCOMPARE(touchWidget.touchUpdatePoints[0].id(), initialTouchPointId);
QCOMPARE(touchWidget.touchUpdatePoints[1].id(), initialTouchPointId + 2);
// release everything
p0.setState(Qt::TouchPointReleased);
p1.setState(Qt::TouchPointReleased);
nativeTouchPoints =
QWindowSystemInterfacePrivate::toNativeTouchPoints(rawTouchPoints, window);
QWindowSystemInterface::handleTouchEvent(window, 0, touchScreenDevice, nativeTouchPoints);
QCoreApplication::processEvents();
QVERIFY(touchWidget.seenTouchBegin);
QVERIFY(touchWidget.seenTouchUpdate);
QVERIFY(touchWidget.seenTouchEnd);
QCOMPARE(touchWidget.touchUpdatePoints.count(), 2);
QCOMPARE(touchWidget.touchUpdatePoints[0].id(), initialTouchPointId);
QCOMPARE(touchWidget.touchUpdatePoints[1].id(), initialTouchPointId + 2);
}
void tst_QTouchEvent::deleteInEventHandler() void tst_QTouchEvent::deleteInEventHandler()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))