@@ -125,23 +125,18 @@ void TouchGate::storeTouchEvent(const QTouchEvent *event)
125125 qDebug() << "[TouchGate] Storing" << qPrintable(touchEventToString(event));
126126 #endif
127127
128− QTouchEvent *clonedEvent = new QTouchEvent(event->type(),
129− event->device(),
130− event->modifiers(),
131− event->touchPointStates(),
132− event->touchPoints());
133−
134− m_storedEvents.append(clonedEvent);
128+ TouchEvent clonedEvent(event);
129+ m_storedEvents.append(std::move(clonedEvent));
135130}
136131
137132void TouchGate::removeTouchFromStoredEvents(int touchId)
138133{
139134 int i = 0;
140135 while (i < m_storedEvents.count()) {
141− QTouchEvent *event = m_storedEvents[i];
142− bool removed = removeTouchFromEvent(touchId, event);
136+ TouchEvent &event = m_storedEvents[i];
137+ bool removed = event.removeTouch(touchId);
143138
144− if (removed && event->touchPoints().isEmpty()) {
139+ if (removed && event.touchPoints.isEmpty()) {
145140 m_storedEvents.removeAt(i);
146141 } else {
147142 ++i;
@@ -149,33 +144,11 @@ void TouchGate::removeTouchFromStoredEvents(int touchId)
149144 }
150145}
151146
152−bool TouchGate::removeTouchFromEvent(int touchId, QTouchEvent *event)
153−{
154− const QList<QTouchEvent::TouchPoint> &eventTouchPoints = event->touchPoints();
155−
156− int indexToRemove = -1;
157− for (int i = 0; i < eventTouchPoints.count() && indexToRemove < 0; ++i) {
158− if (eventTouchPoints[i].id() == touchId) {
159− indexToRemove = i;
160− }
161− }
162−
163− if (indexToRemove >= 0) {
164− QList<QTouchEvent::TouchPoint> newTouchPointsList = eventTouchPoints;
165− newTouchPointsList.removeAt(indexToRemove);
166− event->setTouchPoints(newTouchPointsList);
167− return true;
168− } else {
169− return false;
170− }
171−}
172−
173147void TouchGate::dispatchFullyOwnedEvents()
174148{
175149 while (!m_storedEvents.isEmpty() && eventIsFullyOwned(m_storedEvents.first())) {
176− QTouchEvent *event = m_storedEvents.takeFirst();
150+ TouchEvent event = m_storedEvents.takeFirst();
177151 dispatchTouchEventToTarget(event);
178− delete event;
179152 }
180153}
181154
@@ -200,11 +173,10 @@ QString TouchGate::oldestPendingTouchIdsString()
200173}
201174#endif
202175
203−bool TouchGate::eventIsFullyOwned(const QTouchEvent *event) const
176+bool TouchGate::eventIsFullyOwned(const TouchGate::TouchEvent &event) const
204177{
205− auto touchPoints = event->touchPoints();
206− for (int i = 0; i < touchPoints.count(); ++i) {
207− if (!isTouchPointOwned(touchPoints[i].id())) {
178+ for (int i = 0; i < event.touchPoints.count(); ++i) {
179+ if (!isTouchPointOwned(event.touchPoints[i].id())) {
208180 return false;
209181 }
210182 }
@@ -224,9 +196,37 @@ void TouchGate::setTargetItem(QQuickItem *item)
224196 Q_EMIT targetItemChanged(item);
225197}
226198
199+void TouchGate::dispatchTouchEventToTarget(const TouchEvent &event)
200+{
201+ dispatchTouchEventToTarget(event.eventType,
202+ event.device,
203+ event.modifiers,
204+ event.touchPoints,
205+ event.target,
206+ event.window,
207+ event.timestamp);
208+}
209+
227210void TouchGate::dispatchTouchEventToTarget(QTouchEvent* event)
228211{
229− removeTouchInfoForEndedTouches(event);
212+ dispatchTouchEventToTarget(event->type(),
213+ event->device(),
214+ event->modifiers(),
215+ event->touchPoints(),
216+ event->target(),
217+ event->window(),
218+ event->timestamp());
219+}
220+
221+void TouchGate::dispatchTouchEventToTarget(QEvent::Type eventType,
222+ QTouchDevice *device,
223+ Qt::KeyboardModifiers modifiers,
224+ const QList<QTouchEvent::TouchPoint> &touchPoints,
225+ QObject *target,
226+ QWindow *window,
227+ ulong timestamp)
228+{
229+ removeTouchInfoForEndedTouches(touchPoints);
230230
231231 if (m_targetItem.isNull()) {
232232 qWarning("[TouchGate] Cannot dispatch touch event because target item is null");
@@ -244,9 +244,10 @@ void TouchGate::dispatchTouchEventToTarget(QTouchEvent* event)
244244 }
245245
246246 // Map touch points to targetItem coordinates
247− QList<QTouchEvent::TouchPoint> touchPoints = event->touchPoints();
248− transformTouchPoints(touchPoints, QQuickItemPrivate::get(targetItem)->windowToItemTransform());
249− QTouchEvent *eventForTargetItem = touchEventWithPoints(*event, touchPoints);
247+ QList<QTouchEvent::TouchPoint> targetTouchPoints = touchPoints;
248+ transformTouchPoints(targetTouchPoints, QQuickItemPrivate::get(targetItem)->windowToItemTransform());
249+ QTouchEvent *eventForTargetItem = createQTouchEvent(eventType, device, modifiers, targetTouchPoints,
250+ target, window, timestamp);
250251
251252 #if TOUCHGATE_DEBUG
252253 qDebug() << "[TouchGate] dispatching" << qPrintable(touchEventToString(eventForTargetItem))
@@ -271,15 +272,18 @@ void TouchGate::transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints
271272 }
272273}
273274
274−// NB: From QQuickWindow
275−QTouchEvent *TouchGate::touchEventWithPoints(const QTouchEvent &event,
276− const QList<QTouchEvent::TouchPoint> &newPoints)
275+QTouchEvent *TouchGate::createQTouchEvent(QEvent::Type eventType,
276+ QTouchDevice *device,
277+ Qt::KeyboardModifiers modifiers,
278+ const QList<QTouchEvent::TouchPoint> &touchPoints,
279+ QObject *target,
280+ QWindow *window,
281+ ulong timestamp)
277282{
278283 Qt::TouchPointStates eventStates = 0;
279− for (int i=0; i<newPoints.count(); i++)
280− eventStates |= newPoints[i].state();
284+ for (int i = 0; i < touchPoints.count(); i++)
285+ eventStates |= touchPoints[i].state();
281286 // if all points have the same state, set the event type accordingly
282− QEvent::Type eventType = event.type();
283287 switch (eventStates) {
284288 case Qt::TouchPointPressed:
285289 eventType = QEvent::TouchBegin;
@@ -293,21 +297,19 @@ QTouchEvent *TouchGate::touchEventWithPoints(const QTouchEvent &event,
293297 }
294298
295299 QTouchEvent *touchEvent = new QTouchEvent(eventType);
296− touchEvent->setWindow(event.window());
297− touchEvent->setTarget(event.target());
298− touchEvent->setDevice(event.device());
299− touchEvent->setModifiers(event.modifiers());
300− touchEvent->setTouchPoints(newPoints);
300+ touchEvent->setWindow(window);
301+ touchEvent->setTarget(target);
302+ touchEvent->setDevice(device);
303+ touchEvent->setModifiers(modifiers);
304+ touchEvent->setTouchPoints(touchPoints);
301305 touchEvent->setTouchPointStates(eventStates);
302− touchEvent->setTimestamp(event.timestamp());
306+ touchEvent->setTimestamp(timestamp);
303307 touchEvent->accept();
304308 return touchEvent;
305309}
306310
307−void TouchGate::removeTouchInfoForEndedTouches(QTouchEvent *event)
311+void TouchGate::removeTouchInfoForEndedTouches(const QList<QTouchEvent::TouchPoint> &touchPoints)
308312{
309− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
310−
311313 for (int i = 0; i < touchPoints.size(); ++i) {\
312314 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
313315
@@ -319,3 +321,27 @@ void TouchGate::removeTouchInfoForEndedTouches(QTouchEvent *event)
319321 }
320322 }
321323}
324+
325+TouchGate::TouchEvent::TouchEvent(const QTouchEvent *event)
326+ : eventType(event->type())
327+ , device(event->device())
328+ , modifiers(event->modifiers())
329+ , touchPoints(event->touchPoints())
330+ , target(event->target())
331+ , window(event->window())
332+ , timestamp(event->timestamp())
333+{
334+}
335+
336+bool TouchGate::TouchEvent::removeTouch(int touchId)
337+{
338+ bool removed = false;
339+ for (int i = 0; i < touchPoints.count() && !removed; ++i) {
340+ if (touchPoints[i].id() == touchId) {
341+ touchPoints.removeAt(i);
342+ removed = true;
343+ }
344+ }
345+
346+ return removed;
347+}