summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-04-22 11:03:53 (GMT)
committerDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-05-11 14:51:53 (GMT)
commitec94be7f23bfd9c13e42b9b20f01af69bae83660 (patch)
tree41e380722df80d2de30417ffee804ab79f6ab78d /src
parent7bda9fff3b48d2534fb70cc6a9c4b0b945eaaf12 (diff)
downloadQt-ec94be7f23bfd9c13e42b9b20f01af69bae83660.zip
Qt-ec94be7f23bfd9c13e42b9b20f01af69bae83660.tar.gz
Qt-ec94be7f23bfd9c13e42b9b20f01af69bae83660.tar.bz2
Removed all weird qHash usage for gesture identification.
Diffstat (limited to 'src')
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp9
-rw-r--r--src/gui/kernel/qapplication.cpp25
-rw-r--r--src/gui/kernel/qapplication_p.h4
-rw-r--r--src/gui/kernel/qgesturemanager.cpp41
-rw-r--r--src/gui/kernel/qgesturemanager_p.h12
-rw-r--r--src/gui/kernel/qwidget.cpp35
-rw-r--r--src/gui/kernel/qwidget_p.h1
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 <private/qtextcontrol_p.h>
#include <private/qtextdocumentlayout_p.h>
#include <private/qtextengine_p.h>
+#include <private/qgesturemanager_p.h>
#ifdef Q_WS_X11
#include <private/qt_x11_p.h>
@@ -5811,10 +5812,7 @@ int QGraphicsItem::grabGesture(Qt::GestureType gesture)
*/
int QGraphicsItem::grabGesture(const QString &gesture)
{
- int id = qHash(gesture);
- QSet<int>::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<QWidget*>(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<gesture id -> number of grabbed widgets (something like refcount)
QGestureManager *gestureManager;
- QMap<int, int> grabbedGestures;
+ // map<gesture name -> number of widget subscribed to it>
+ QMap<QString, int> 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<int, int> &grabbedGestures = qApp->d_func()->grabbedGestures;
+ const QMap<QString, int> &grabbedGestures = qApp->d_func()->grabbedGestures;
bool ret = false;
QSet<QGestureRecognizer*> startedGestures;
@@ -120,7 +121,7 @@ bool QGestureManager::filterEvent(QEvent *event)
QSet<QGestureRecognizer*> 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<QGestureRecognizer*>(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<int> eventGestures;
+ QSet<QString> 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<int> 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<int, QString> 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<int>::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<int>::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<int> 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