diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-05-27 15:22:31 (GMT) |
---|---|---|
committer | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-05-27 15:22:31 (GMT) |
commit | 20fa050643f72b4bc91386c5fff62cdfe3b75393 (patch) | |
tree | fe0bdefb2007b79739b5e0de01bebee08ee5c8c0 /src | |
parent | 8598ffab46a500b9077d437ffc72d0e6fc843712 (diff) | |
download | Qt-20fa050643f72b4bc91386c5fff62cdfe3b75393.zip Qt-20fa050643f72b4bc91386c5fff62cdfe3b75393.tar.gz Qt-20fa050643f72b4bc91386c5fff62cdfe3b75393.tar.bz2 |
Make Qt::TouchPointState ORable, add Q*TouchEvent::touchPointStates()
This new function returns a bitwise OR of all the touch point states for
the event. This makes it easy to see if a certain type of state is present
or not without the need to loop over all touch points.
QApplication and QGraphicsScene need to build this state when dispatching
the touch points. This also fixes the ASSERT bug that Denis found when
trying to send multiple touch presses in a touch begin event.
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qnamespace.h | 10 | ||||
-rw-r--r-- | src/gui/graphicsview/qgraphicsscene.cpp | 85 | ||||
-rw-r--r-- | src/gui/graphicsview/qgraphicsscene_p.h | 14 | ||||
-rw-r--r-- | src/gui/graphicsview/qgraphicssceneevent.cpp | 46 | ||||
-rw-r--r-- | src/gui/graphicsview/qgraphicssceneevent.h | 9 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_p.h | 8 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_win.cpp | 59 | ||||
-rw-r--r-- | src/gui/kernel/qevent.cpp | 17 | ||||
-rw-r--r-- | src/gui/kernel/qevent.h | 16 |
9 files changed, 165 insertions, 99 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 29f6701..a6db1a4 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1546,11 +1546,12 @@ public: }; enum TouchPointState { - TouchPointPressed, - TouchPointMoved, - TouchPointStationary, - TouchPointReleased + TouchPointPressed = 0x01, + TouchPointMoved = 0x02, + TouchPointStationary = 0x04, + TouchPointReleased = 0x08 }; + Q_DECLARE_FLAGS(TouchPointStates, TouchPointState) enum GestureType { @@ -1608,6 +1609,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::DropActions) Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::ItemFlags) Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::MatchFlags) Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::TextInteractionFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::TouchPointStates) typedef bool (*qInternalCallback)(void **); diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 952e0c1..e7a0547 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -4027,7 +4027,7 @@ void QGraphicsScenePrivate::sendGestureEvent(const QSet<QGesture*> &gestures, co gd->graphicsItem = 0; //### THIS IS BS, DONT FORGET TO REWRITE THIS CODE - // need to make sure we try to deliver event just once to each widget + // need to make sure we try to deliver event just once to each widget const QString gestureType = g->type(); QList<QGraphicsItem*> itemsUnderGesture = q->items(g->hotSpot()); for (int i = 0; i < itemsUnderGesture.size(); ++i) { @@ -5710,13 +5710,9 @@ QGraphicsSceneTouchEvent::TouchPoint *QGraphicsScenePrivate::findClosestTouchPoi return closestTouchPoint; } -QEvent::Type QGraphicsScenePrivate::appendTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, - QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints) +void QGraphicsScenePrivate::appendTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, + QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints) { - QEvent::Type eventType = currentTouchPoints->isEmpty() - ? QEvent::GraphicsSceneTouchBegin - : QEvent::GraphicsSceneTouchUpdate; - // insort touch point (for the app) int at = 0; for (; at < sceneCurrentTouchPoints.count(); ++at) { @@ -5730,12 +5726,10 @@ QEvent::Type QGraphicsScenePrivate::appendTouchPoint(QGraphicsSceneTouchEvent::T break; } currentTouchPoints->insert(at, touchPoint); - - return eventType; } -QEvent::Type QGraphicsScenePrivate::removeTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, - QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints) +void QGraphicsScenePrivate::removeTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, + QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints) { // remove touch point from all known touch points for (int i = qMin(sceneCurrentTouchPoints.count() - 1, touchPoint->id()); i >= 0; --i) { @@ -5751,21 +5745,19 @@ QEvent::Type QGraphicsScenePrivate::removeTouchPoint(QGraphicsSceneTouchEvent::T break; } } - - return currentTouchPoints->isEmpty() ? QEvent::GraphicsSceneTouchEnd : QEvent::GraphicsSceneTouchUpdate; } void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTouchEvent) { QList<QGraphicsSceneTouchEvent::TouchPoint *> sceneActiveTouchPoints = sceneCurrentTouchPoints; - QHash<QGraphicsItem *, QGraphicsSceneTouchEvent *> itemsNeedingEvents; + typedef QPair<Qt::TouchPointStates, QList<QGraphicsSceneTouchEvent::TouchPoint *> > StatesAndTouchPoints; + QHash<QGraphicsItem *, StatesAndTouchPoints> itemsNeedingEvents; for (int i = 0; i < sceneTouchEvent->touchPoints().count(); ++i) { QGraphicsSceneTouchEvent::TouchPoint *touchPoint = sceneTouchEvent->touchPoints().at(i); // update state QGraphicsItem *item = 0; - QEvent::Type eventType = QEvent::None; QList<QGraphicsSceneTouchEvent::TouchPoint *> activeTouchPoints; if (touchPoint->state() == Qt::TouchPointPressed) { // determine which item this event will go to @@ -5789,7 +5781,7 @@ void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTou itemForTouchPointId.insert(touchPoint->id(), item); QList<QGraphicsSceneTouchEvent::TouchPoint *> ¤tTouchPoints = itemCurrentTouchPoints[item]; - eventType = appendTouchPoint(touchPoint, ¤tTouchPoints); + appendTouchPoint(touchPoint, ¤tTouchPoints); // make sure new points are added to activeTouchPoints as well sceneActiveTouchPoints = sceneCurrentTouchPoints; activeTouchPoints = currentTouchPoints; @@ -5801,7 +5793,7 @@ void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTou QList<QGraphicsSceneTouchEvent::TouchPoint *> ¤tTouchPoints = itemCurrentTouchPoints[item]; sceneActiveTouchPoints = sceneCurrentTouchPoints; activeTouchPoints = currentTouchPoints; - eventType = removeTouchPoint(touchPoint, ¤tTouchPoints); + removeTouchPoint(touchPoint, ¤tTouchPoints); } else { item = itemForTouchPointId.value(touchPoint->id()); if (!item) @@ -5809,20 +5801,11 @@ void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTou sceneActiveTouchPoints = sceneCurrentTouchPoints; activeTouchPoints = itemCurrentTouchPoints.value(item); - eventType = QEvent::GraphicsSceneTouchUpdate; - } - Q_ASSERT(eventType != QEvent::None); - - if (touchPoint->state() != Qt::TouchPointStationary) { - QGraphicsSceneTouchEvent *&touchEvent = itemsNeedingEvents[item]; - if (!touchEvent) { - touchEvent = new QGraphicsSceneTouchEvent(eventType); - touchEvent->setWidget(sceneTouchEvent->widget()); - touchEvent->setModifiers(sceneTouchEvent->modifiers()); - } - Q_ASSERT(touchEvent->type() == eventType); - touchEvent->setTouchPoints(activeTouchPoints); } + + StatesAndTouchPoints &statesAndTouchPoints = itemsNeedingEvents[item]; + statesAndTouchPoints.first |= touchPoint->state(); + statesAndTouchPoints.second = activeTouchPoints; } if (itemsNeedingEvents.isEmpty()) { @@ -5831,21 +5814,45 @@ void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTou } bool acceptSceneTouchEvent = false; - QHash<QGraphicsItem *, QGraphicsSceneTouchEvent *>::ConstIterator it = itemsNeedingEvents.constBegin(); - const QHash<QGraphicsItem *, QGraphicsSceneTouchEvent *>::ConstIterator end = itemsNeedingEvents.constEnd(); + QHash<QGraphicsItem *, StatesAndTouchPoints>::ConstIterator it = itemsNeedingEvents.constBegin(); + const QHash<QGraphicsItem *, StatesAndTouchPoints>::ConstIterator end = itemsNeedingEvents.constEnd(); for (; it != end; ++it) { QGraphicsItem *item = it.key(); - QGraphicsSceneTouchEvent *touchEvent = it.value(); + // determine event type from the state mask + QEvent::Type eventType; + switch (it.value().first) { + case Qt::TouchPointPressed: + // all touch points have pressed state + eventType = QEvent::GraphicsSceneTouchBegin; + break; + case Qt::TouchPointReleased: + // all touch points have released state + eventType = QEvent::GraphicsSceneTouchEnd; + break; + case Qt::TouchPointStationary: + // don't send the event if nothing changed + continue; + default: + // all other combinations + eventType = QEvent::GraphicsSceneTouchUpdate; + break; + } + + QGraphicsSceneTouchEvent touchEvent(eventType); + touchEvent.setWidget(sceneTouchEvent->widget()); + touchEvent.setModifiers(sceneTouchEvent->modifiers()); + touchEvent.setTouchPointStates(it.value().first); + touchEvent.setTouchPoints(it.value().second); - switch (touchEvent->type()) { + switch (touchEvent.type()) { case QEvent::GraphicsSceneTouchBegin: { // if the TouchBegin handler recurses, we assume that means the event // has been implicitly accepted and continue to send touch events item->d_ptr->acceptedTouchBeginEvent = true; - bool res = sendTouchBeginEvent(item, touchEvent) - && touchEvent->isAccepted(); + bool res = sendTouchBeginEvent(item, &touchEvent) + && touchEvent.isAccepted(); acceptSceneTouchEvent = acceptSceneTouchEvent || res; break; } @@ -5859,14 +5866,12 @@ void QGraphicsScenePrivate::touchEventHandler(QGraphicsSceneTouchEvent *sceneTou } default: if (item->d_ptr->acceptedTouchBeginEvent) { - updateTouchPointsForItem(item, touchEvent); - (void) sendEvent(item, touchEvent); + updateTouchPointsForItem(item, &touchEvent); + (void) sendEvent(item, &touchEvent); acceptSceneTouchEvent = true; } break; } - - delete touchEvent; } sceneTouchEvent->setAccepted(acceptSceneTouchEvent); } diff --git a/src/gui/graphicsview/qgraphicsscene_p.h b/src/gui/graphicsview/qgraphicsscene_p.h index 160ba49..22feb4c 100644 --- a/src/gui/graphicsview/qgraphicsscene_p.h +++ b/src/gui/graphicsview/qgraphicsscene_p.h @@ -164,7 +164,7 @@ public: void grabKeyboard(QGraphicsItem *item); void ungrabKeyboard(QGraphicsItem *item, bool itemIsDying = false); void clearKeyboardGrabber(); - + QGraphicsItem *dragDropItem; QGraphicsWidget *enterWidget; Qt::DropAction lastDropAction; @@ -244,7 +244,7 @@ public: static bool closestItemLast_withoutCache(const QGraphicsItem *item1, const QGraphicsItem *item2); static inline bool closestItemFirst_withCache(const QGraphicsItem *item1, const QGraphicsItem *item2) - { + { return item1->d_ptr->globalStackingOrder < item2->d_ptr->globalStackingOrder; } static inline bool closestItemLast_withCache(const QGraphicsItem *item1, const QGraphicsItem *item2) @@ -257,7 +257,7 @@ public: void drawItemHelper(QGraphicsItem *item, QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget, bool painterStateProtection); - + QStyle *style; QFont font; void setFont_helper(const QFont &font); @@ -285,10 +285,10 @@ public: static void updateTouchPointsForItem(QGraphicsItem *item, QGraphicsSceneTouchEvent *touchEvent); static QGraphicsSceneTouchEvent::TouchPoint *findClosestTouchPoint(const QList<QGraphicsSceneTouchEvent::TouchPoint *> &activeTouchPoints, const QPointF &scenePos); - QEvent::Type appendTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, - QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints); - QEvent::Type removeTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, - QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints); + void appendTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, + QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints); + void removeTouchPoint(QGraphicsSceneTouchEvent::TouchPoint *touchPoint, + QList<QGraphicsSceneTouchEvent::TouchPoint *> *currentTouchPoints); void touchEventHandler(QGraphicsSceneTouchEvent *touchEvent); bool sendTouchBeginEvent(QGraphicsItem *item, QGraphicsSceneTouchEvent *touchEvent); }; diff --git a/src/gui/graphicsview/qgraphicssceneevent.cpp b/src/gui/graphicsview/qgraphicssceneevent.cpp index bb13bd8..0104e9c 100644 --- a/src/gui/graphicsview/qgraphicssceneevent.cpp +++ b/src/gui/graphicsview/qgraphicssceneevent.cpp @@ -1957,11 +1957,12 @@ class QGraphicsSceneTouchEventPrivate : public QGraphicsSceneEventPrivate Q_DECLARE_PUBLIC(QGraphicsSceneTouchEvent) public: inline QGraphicsSceneTouchEventPrivate() - : modifiers(Qt::NoModifier) + : modifiers(Qt::NoModifier), touchPointStates() { } - QList<QGraphicsSceneTouchEvent::TouchPoint *> touchPoints; Qt::KeyboardModifiers modifiers; + Qt::TouchPointStates touchPointStates; + QList<QGraphicsSceneTouchEvent::TouchPoint *> touchPoints; }; /*! @@ -1980,38 +1981,55 @@ QGraphicsSceneTouchEvent::~QGraphicsSceneTouchEvent() { } /*! - Returns the list of touch points for this event. + Returns the keyboard modifiers in use at the time the event was + sent. +*/ +Qt::KeyboardModifiers QGraphicsSceneTouchEvent::modifiers() const +{ + Q_D(const QGraphicsSceneTouchEvent); + return d->modifiers; +} - \sa QGraphicsSceneTouchEvent::TouchPoint +/*! \internal */ +void QGraphicsSceneTouchEvent::setModifiers(Qt::KeyboardModifiers modifiers) +{ + Q_D(QGraphicsSceneTouchEvent); + d->modifiers = modifiers; +} + +/*! + Returns a bitwise OR of all of the touch point states at the time + the event was sent. */ -const QList<QGraphicsSceneTouchEvent::TouchPoint *> &QGraphicsSceneTouchEvent::touchPoints() const +Qt::TouchPointStates QGraphicsSceneTouchEvent::touchPointStates() const { Q_D(const QGraphicsSceneTouchEvent); - return d->touchPoints; + return d->touchPointStates; } /*! \internal */ -void QGraphicsSceneTouchEvent::setTouchPoints(const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints) +void QGraphicsSceneTouchEvent::setTouchPointStates(Qt::TouchPointStates touchPointStates) { Q_D(QGraphicsSceneTouchEvent); - d->touchPoints = touchPoints; + d->touchPointStates = touchPointStates; } /*! - Returns the keyboard modifiers in use at the time the event was - sent. + Returns the list of touch points for this event. + + \sa QGraphicsSceneTouchEvent::TouchPoint */ -Qt::KeyboardModifiers QGraphicsSceneTouchEvent::modifiers() const +const QList<QGraphicsSceneTouchEvent::TouchPoint *> &QGraphicsSceneTouchEvent::touchPoints() const { Q_D(const QGraphicsSceneTouchEvent); - return d->modifiers; + return d->touchPoints; } /*! \internal */ -void QGraphicsSceneTouchEvent::setModifiers(Qt::KeyboardModifiers modifiers) +void QGraphicsSceneTouchEvent::setTouchPoints(const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints) { Q_D(QGraphicsSceneTouchEvent); - d->modifiers = modifiers; + d->touchPoints = touchPoints; } /*! diff --git a/src/gui/graphicsview/qgraphicssceneevent.h b/src/gui/graphicsview/qgraphicssceneevent.h index 8b24d33..9fcda2f 100644 --- a/src/gui/graphicsview/qgraphicssceneevent.h +++ b/src/gui/graphicsview/qgraphicssceneevent.h @@ -372,12 +372,15 @@ public: QGraphicsSceneTouchEvent(Type type = None); ~QGraphicsSceneTouchEvent(); - const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints() const; - void setTouchPoints(const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints); - Qt::KeyboardModifiers modifiers() const; void setModifiers(Qt::KeyboardModifiers modifiers); + Qt::TouchPointStates touchPointStates() const; + void setTouchPointStates(Qt::TouchPointStates touchPointStates); + + const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints() const; + void setTouchPoints(const QList<QGraphicsSceneTouchEvent::TouchPoint *> &touchPoints); + private: Q_DECLARE_PRIVATE(QGraphicsSceneTouchEvent); }; diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index 08020fb..34395c9 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -450,10 +450,10 @@ public: void initializeMultitouch(); static QTouchEvent::TouchPoint *findClosestTouchPoint(const QList<QTouchEvent::TouchPoint *> &activeTouchPoints, const QPointF &screenPos); - QEvent::Type appendTouchPoint(QTouchEvent::TouchPoint *touchPoint, - QList<QTouchEvent::TouchPoint *> *currentTouchPoints); - QEvent::Type removeTouchPoint(QTouchEvent::TouchPoint *touchPoint, - QList<QTouchEvent::TouchPoint *> *currentTouchPoints); + void appendTouchPoint(QTouchEvent::TouchPoint *touchPoint, + QList<QTouchEvent::TouchPoint *> *currentTouchPoints); + void removeTouchPoint(QTouchEvent::TouchPoint *touchPoint, + QList<QTouchEvent::TouchPoint *> *currentTouchPoints); bool translateTouchEvent(const MSG &msg); #endif diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 148988f..0fc76ae 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -4011,13 +4011,9 @@ QTouchEvent::TouchPoint *QApplicationPrivate::findClosestTouchPoint(const QList< return closestTouchPoint; } -QEvent::Type QApplicationPrivate::appendTouchPoint(QTouchEvent::TouchPoint *touchPoint, - QList<QTouchEvent::TouchPoint *> *currentTouchPoints) +void QApplicationPrivate::appendTouchPoint(QTouchEvent::TouchPoint *touchPoint, + QList<QTouchEvent::TouchPoint *> *currentTouchPoints) { - QEvent::Type eventType = currentTouchPoints->isEmpty() - ? QEvent::TouchBegin - : QEvent::TouchUpdate; - // insort touch point (for the app) int at = 0; for (; at < appCurrentTouchPoints.count(); ++at) { @@ -4037,12 +4033,10 @@ QEvent::Type QApplicationPrivate::appendTouchPoint(QTouchEvent::TouchPoint *touc appCurrentTouchPoints.count(), appAllTouchPoints.count()); } - - return eventType; } -QEvent::Type QApplicationPrivate::removeTouchPoint(QTouchEvent::TouchPoint *touchPoint, - QList<QTouchEvent::TouchPoint *> *currentTouchPoints) +void QApplicationPrivate::removeTouchPoint(QTouchEvent::TouchPoint *touchPoint, + QList<QTouchEvent::TouchPoint *> *currentTouchPoints) { // remove touch point from all known touch points for (int i = qMin(appCurrentTouchPoints.count() - 1, touchPoint->id()); i >= 0; --i) { @@ -4058,8 +4052,6 @@ QEvent::Type QApplicationPrivate::removeTouchPoint(QTouchEvent::TouchPoint *touc break; } } - - return currentTouchPoints->isEmpty() ? QEvent::TouchEnd : QEvent::TouchUpdate; } bool QApplicationPrivate::translateTouchEvent(const MSG &msg) @@ -4072,7 +4064,8 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) QList<QTouchEvent::TouchPoint *> appActiveTouchPoints = appCurrentTouchPoints; - QHash<QWidget *, QTouchEvent> widgetsNeedingEvents; + typedef QPair<Qt::TouchPointStates, QList<QTouchEvent::TouchPoint *> > StatesAndTouchPoints; + QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents; QVector<TOUCHINPUT> winTouchInputs(msg.wParam); memset(winTouchInputs.data(), 0, sizeof(TOUCHINPUT) * winTouchInputs.count()); QApplicationPrivate::GetTouchInputInfo((HANDLE) msg.lParam, msg.wParam, winTouchInputs.data(), sizeof(TOUCHINPUT)); @@ -4096,7 +4089,6 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) QWidget *widget = 0; bool down = touchPoint->state() != Qt::TouchPointReleased; QPointF screenPos(qreal(touchInput.x) / qreal(100.), qreal(touchInput.y) / qreal(100.)); - QEvent::Type eventType = QEvent::None; QList<QTouchEvent::TouchPoint *> activeTouchPoints; if (!down && (touchInput.dwFlags & TOUCHEVENTF_DOWN)) { @@ -4116,7 +4108,7 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) widgetForTouchPointId[touchPoint->id()] = widget; QList<QTouchEvent::TouchPoint *> ¤tTouchPoints = widgetCurrentTouchPoints[widget]; - eventType = appendTouchPoint(touchPoint, ¤tTouchPoints); + appendTouchPoint(touchPoint, ¤tTouchPoints); // make sure new points are added to activeTouchPoints as well appActiveTouchPoints = appCurrentTouchPoints; activeTouchPoints = currentTouchPoints; @@ -4131,7 +4123,7 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) QList<QTouchEvent::TouchPoint *> ¤tTouchPoints = widgetCurrentTouchPoints[widget]; appActiveTouchPoints = appCurrentTouchPoints; activeTouchPoints = currentTouchPoints; - eventType = removeTouchPoint(touchPoint, ¤tTouchPoints); + removeTouchPoint(touchPoint, ¤tTouchPoints); touchPoint->setState(Qt::TouchPointReleased); touchPoint->setLastScreenPos(touchPoint->screenPos()); @@ -4141,7 +4133,6 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) widget = widgetForTouchPointId.value(touchPoint->id()); appActiveTouchPoints = appCurrentTouchPoints; activeTouchPoints = widgetCurrentTouchPoints.value(widget); - eventType = QEvent::TouchUpdate; touchPoint->setState(screenPos == touchPoint->screenPos() ? Qt::TouchPointStationary : Qt::TouchPointMoved); @@ -4149,12 +4140,11 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) touchPoint->setScreenPos(screenPos); // pressure should still be 1. } - Q_ASSERT(widget != 0 && eventType != QEvent::None); + Q_ASSERT(widget != 0); - if (touchPoint->state() != Qt::TouchPointStationary) { - widgetsNeedingEvents.insert(widget, - QTouchEvent(eventType, q->keyboardModifiers(), activeTouchPoints)); - } + StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[widget]; + maskAndPoints.first |= touchPoint->state(); + maskAndPoints.second = activeTouchPoints; } QApplicationPrivate::CloseTouchInputHandle((HANDLE) msg.lParam); @@ -4164,14 +4154,33 @@ bool QApplicationPrivate::translateTouchEvent(const MSG &msg) bool returnValue = false; qt_tabletChokeMouse = false; - QHash<QWidget *, QTouchEvent>::ConstIterator it = widgetsNeedingEvents.constBegin(); - const QHash<QWidget *, QTouchEvent>::ConstIterator end = widgetsNeedingEvents.constEnd(); + QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin(); + const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd(); for (; it != end; ++it) { QWidget *widget = it.key(); if (!QApplicationPrivate::tryModalHelper(widget, 0)) continue; - QTouchEvent touchEvent = it.value(); + QEvent::Type eventType; + switch(it.value().first) { + case Qt::TouchPointPressed: + eventType = QEvent::TouchBegin; + break; + case Qt::TouchPointReleased: + eventType = QEvent::TouchEnd; + break; + case Qt::TouchPointStationary: + // don't send the event if nothing changed + continue; + default: + eventType = QEvent::TouchUpdate; + break; + } + + QTouchEvent touchEvent(eventType, + q->keyboardModifiers(), + it.value().first, + it.value().second); updateTouchPointsForWidget(widget, &touchEvent); switch (touchEvent.type()) { diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 419107c..7a4c424 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -3727,8 +3727,11 @@ void QGestureEvent::accept(const QString &type) */ QTouchEvent::QTouchEvent(QEvent::Type type, Qt::KeyboardModifiers modifiers, + Qt::TouchPointStates touchPointStates, const QList<QTouchEvent::TouchPoint *> &touchPoints) - : QInputEvent(type, modifiers), _touchPoints(touchPoints) + : QInputEvent(type, modifiers), + _touchPointStates(touchPointStates), + _touchPoints(touchPoints) { } /*! @@ -3737,6 +3740,18 @@ QTouchEvent::QTouchEvent(QEvent::Type type, QTouchEvent::~QTouchEvent() { } +/*! \fn Qt::TouchPointStates QTouchEvent::touchPointStates() const + + Returns a bitwise OR of all the touch point states for this event. +*/ + +/*! \fn void QTouchEvent::setTouchPointStates(Qt::TouchPointStates touchPointStates) + + \internal + + Sets a bitwise OR of all the touch point states for this event. +*/ + /*! \fn const QList<QTouchEvent::TouchPoint *> &QTouchEvent::TouchPoints() const Returns the list of touch points contained in the touch event. diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index 75cfb9d..0c7d101 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -800,16 +800,30 @@ public: QTouchEvent(QEvent::Type type, Qt::KeyboardModifiers modifiers, + Qt::TouchPointStates touchPointStates, const QList<QTouchEvent::TouchPoint *> &touchPoints); ~QTouchEvent(); - inline const QList<QTouchEvent::TouchPoint *> &touchPoints() const { return _touchPoints; } + inline Qt::TouchPointStates touchPointStates() const + { + return _touchPointStates; + } + inline void setTouchPointStates(Qt::TouchPointStates touchPointStates) + { + _touchPointStates = touchPointStates; + } + + inline const QList<QTouchEvent::TouchPoint *> &touchPoints() const + { + return _touchPoints; + } inline void setTouchPoints(const QList<QTouchEvent::TouchPoint *> &touchPoints) { _touchPoints = touchPoints; } protected: + Qt::TouchPointStates _touchPointStates; QList<QTouchEvent::TouchPoint *> _touchPoints; }; |