From ec94be7f23bfd9c13e42b9b20f01af69bae83660 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Wed, 22 Apr 2009 13:03:53 +0200 Subject: Removed all weird qHash usage for gesture identification. --- src/gui/graphicsview/qgraphicsitem.cpp | 9 ++++---- src/gui/kernel/qapplication.cpp | 25 ++++++++++----------- src/gui/kernel/qapplication_p.h | 4 ++-- src/gui/kernel/qgesturemanager.cpp | 41 ++++++++++++++++++++++++++++------ src/gui/kernel/qgesturemanager_p.h | 12 +++++++++- src/gui/kernel/qwidget.cpp | 35 +++++++++++++++++------------ src/gui/kernel/qwidget_p.h | 1 + 7 files changed, 85 insertions(+), 42 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 0dc227a..3d2d1b6 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -521,6 +521,7 @@ #include #include #include +#include #ifdef Q_WS_X11 #include @@ -5811,10 +5812,7 @@ int QGraphicsItem::grabGesture(Qt::GestureType gesture) */ int QGraphicsItem::grabGesture(const QString &gesture) { - int id = qHash(gesture); - QSet::iterator it = d_ptr->gestures.find(id); - if (it != d_ptr->gestures.end()) - return *it; + int id = QGestureManager::instance()->makeGestureId(gesture); d_ptr->gestures << id; if (d_ptr->scene) d_ptr->scene->d_func()->grabGesture(this, id); @@ -5829,9 +5827,10 @@ int QGraphicsItem::grabGesture(const QString &gesture) */ void QGraphicsItem::releaseGesture(int gestureId) { - d_ptr->gestures.remove(gestureId); if (d_ptr->scene) d_ptr->scene->d_func()->releaseGesture(this, gestureId); + QGestureManager::instance()->releaseGestureId(gestureId); + d_ptr->gestures.remove(gestureId); } /*! diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index ef602c6..39aeaa6 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -137,6 +137,14 @@ int QApplicationPrivate::autoMaximizeThreshold = -1; bool QApplicationPrivate::autoSipEnabled = false; #endif +QGestureManager* QGestureManager::instance() +{ + QApplicationPrivate *d = qApp->d_func(); + if (!d->gestureManager) + d->gestureManager = new QGestureManager(qApp); + return d->gestureManager; +} + QApplicationPrivate::QApplicationPrivate(int &argc, char **argv, QApplication::Type type) : QCoreApplicationPrivate(argc, argv) { @@ -3711,8 +3719,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QWidget *w = static_cast(receiver); // if we are in gesture mode, we send all mouse events // directly to gesture recognizer. - if (!d->gestureManager) - d->gestureManager = new QGestureManager(this); + (void)QGestureManager::instance(); if (d->gestureManager->inGestureMode()) { if (d->gestureManager->filterEvent(e)) return true; @@ -5098,9 +5105,7 @@ bool QApplicationPrivate::shouldSetFocus(QWidget *w, Qt::FocusPolicy policy) void QApplication::addGestureRecognizer(QGestureRecognizer *recognizer) { Q_D(QApplication); - if (!d->gestureManager) - d->gestureManager = new QGestureManager(this); - d->gestureManager->addRecognizer(recognizer); + QGestureManager::instance()->addRecognizer(recognizer); } /*! @@ -5129,18 +5134,12 @@ void QApplication::removeGestureRecognizer(QGestureRecognizer *recognizer) */ void QApplication::setEventDeliveryDelayForGestures(int delay) { - Q_D(QApplication); - if (!d->gestureManager) - d->gestureManager = new QGestureManager(this); - d->gestureManager->setEventDeliveryDelay(delay); + QGestureManager::instance()->setEventDeliveryDelay(delay); } int QApplication::eventDeliveryDelayForGestures() { - Q_D(QApplication); - if (!d->gestureManager) - d->gestureManager = new QGestureManager(this); - return d->gestureManager->eventDeliveryDelay(); + return QGestureManager::instance()->eventDeliveryDelay(); } /*! \fn QDecoration &QApplication::qwsDecoration() diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index a6cb927..a375933 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -429,9 +429,9 @@ public: void sendSyntheticEnterLeave(QWidget *widget); #endif - // map number of grabbed widgets (something like refcount) QGestureManager *gestureManager; - QMap grabbedGestures; + // map number of widget subscribed to it> + QMap grabbedGestures; static void updateTouchPointsForWidget(QWidget *widget, QTouchEvent *touchEvent); diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index 1a37a05..b4939c4 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -45,6 +45,7 @@ #include "qapplication.h" #include "qapplication_p.h" +#include "qwidget.h" #include "qwidget_p.h" #include "qgesturestandardrecognizers_p.h" @@ -104,7 +105,7 @@ bool QGestureManager::filterEvent(QEvent *event) default: break; } - const QMap &grabbedGestures = qApp->d_func()->grabbedGestures; + const QMap &grabbedGestures = qApp->d_func()->grabbedGestures; bool ret = false; QSet startedGestures; @@ -120,7 +121,7 @@ bool QGestureManager::filterEvent(QEvent *event) QSet stillMaybeGestures; // try other recognizers. foreach(QGestureRecognizer *r, recognizers) { - if (grabbedGestures.value(qHash(r->gestureType()), 0) <= 0) + if (grabbedGestures.value(r->gestureType(), 0) <= 0) continue; QGestureRecognizer::Result result = r->filterEvent(event); if (result == QGestureRecognizer::GestureStarted) { @@ -213,7 +214,7 @@ bool QGestureManager::filterEvent(QEvent *event) Q_ASSERT(!activeGestures.isEmpty()); foreach(QGestureRecognizer *r, recognizers) { - if (grabbedGestures.value(qHash(r->gestureType()), 0) <= 0) + if (grabbedGestures.value(r->gestureType(), 0) <= 0) continue; QGestureRecognizer::Result result = r->filterEvent(event); if (result == QGestureRecognizer::GestureStarted) { @@ -411,7 +412,7 @@ void QGestureManager::recognizerStateChanged(QGestureRecognizer::Result result) QGestureRecognizer *recognizer = qobject_cast(sender()); if (!recognizer) return; - if (qApp->d_func()->grabbedGestures.value(qHash(recognizer->gestureType()), 0) <= 0) { + if (qApp->d_func()->grabbedGestures.value(recognizer->gestureType(), 0) <= 0) { recognizer->reset(); return; } @@ -477,12 +478,22 @@ void QGestureManager::recognizerStateChanged(QGestureRecognizer::Result result) bool QGestureManager::sendGestureEvent(QWidget *receiver, QGestureEvent *event) { - QSet eventGestures; + QSet eventGestures; foreach(const QString &gesture, event->gestureTypes()) - eventGestures << qHash(gesture); + eventGestures << gesture; QPoint offset; - while (receiver && (receiver->d_func()->gestures & eventGestures).isEmpty()) { + bool found = false; + while (receiver) { + QSet widgetGestures = receiver->d_func()->gestures; + foreach(int gestureId, widgetGestures) { + if (eventGestures.contains(gestureNameFromId(gestureId))) { + found = true; + break; + } + } + if (found) + break; offset += receiver->pos(); receiver = receiver->parentWidget(); } @@ -501,6 +512,22 @@ void QGestureManager::setEventDeliveryDelay(int ms) eventDeliveryDelayTimeout = ms; } +int QGestureManager::makeGestureId(const QString &name) +{ + gestureIdMap[++lastGestureId] = name; + return lastGestureId; +} + +void QGestureManager::releaseGestureId(int gestureId) +{ + gestureIdMap.remove(gestureId); +} + +QString QGestureManager::gestureNameFromId(int gestureId) const +{ + return gestureIdMap.value(gestureId); +} + QT_END_NAMESPACE #include "moc_qgesturemanager_p.cpp" diff --git a/src/gui/kernel/qgesturemanager_p.h b/src/gui/kernel/qgesturemanager_p.h index c22027f..9d6d500 100644 --- a/src/gui/kernel/qgesturemanager_p.h +++ b/src/gui/kernel/qgesturemanager_p.h @@ -53,7 +53,6 @@ // We mean it. // -#include "qwidget.h" #include "qlist.h" #include "qset.h" #include "qevent.h" @@ -63,6 +62,7 @@ QT_BEGIN_NAMESPACE +class QWidget; class Q_GUI_EXPORT QGestureManager : public QObject { Q_OBJECT @@ -80,6 +80,13 @@ public: bool filterEvent(QEvent *event); bool inGestureMode(); + int makeGestureId(const QString &name); + void releaseGestureId(int gestureId); + QString gestureNameFromId(int gestureId) const; + + // declared in qapplication.cpp + static QGestureManager* instance(); + protected: void timerEvent(QTimerEvent *event); @@ -100,6 +107,9 @@ private: int delayedPressTimer; QMouseEvent lastMousePressEvent; + QMap gestureIdMap; + int lastGestureId; + enum State { Gesture, NotGesture, diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 0029809..22c2ea7 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -109,6 +109,7 @@ #include "private/qabstractscrollarea_p.h" #include "private/qgraphicssystem_p.h" +#include "private/qgesturemanager_p.h" // widget/widget data creation count //#define QWIDGET_EXTRA_DEBUG @@ -11032,17 +11033,27 @@ QWindowSurface *QWidget::windowSurface() const int QWidget::grabGesture(const QString &gesture) { Q_D(QWidget); - return d->grabGesture(qHash(gesture)); + return d->grabGesture(QGestureManager::instance()->makeGestureId(gesture)); } -int QWidgetPrivate::grabGesture(int id) +int QWidgetPrivate::grabGesture(int gestureId) { - QSet::iterator it = gestures.find(id); - if (it != gestures.end()) - return *it; - gestures << id; - ++qApp->d_func()->grabbedGestures[id]; - return id; + gestures << gestureId; + ++qApp->d_func()->grabbedGestures[QGestureManager::instance()->gestureNameFromId(gestureId)]; + return gestureId; +} + +bool QWidgetPrivate::releaseGesture(int gestureId) +{ + QApplicationPrivate *qAppPriv = qApp->d_func(); + if (gestures.contains(gestureId)) { + QString name = QGestureManager::instance()->gestureNameFromId(gestureId); + Q_ASSERT(qAppPriv->grabbedGestures[name] > 0); + --qAppPriv->grabbedGestures[name]; + gestures.remove(gestureId); + return true; + } + return false; } /*! @@ -11066,12 +11077,8 @@ int QWidget::grabGesture(Qt::GestureType gesture) void QWidget::releaseGesture(int gestureId) { Q_D(QWidget); - QSet::iterator it = d->gestures.find(gestureId); - if (it != d->gestures.end()) { - Q_ASSERT(qApp->d_func()->grabbedGestures[gestureId] > 0); - --qApp->d_func()->grabbedGestures[gestureId]; - d->gestures.erase(it); - } + if (d->releaseGesture(gestureId)) + QGestureManager::instance()->releaseGestureId(gestureId); } /*! diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index abd7b8a..1ab31e4 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -595,6 +595,7 @@ public: QSet gestures; int grabGesture(int gestureId); + bool releaseGesture(int gestureId); #if defined(Q_WS_X11) || defined (Q_WS_WIN) || defined(Q_WS_MAC) #ifdef Q_WS_MAC -- cgit v0.12