src/gui/kernel/qgesturemanager.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/gui/kernel/qgesturemanager.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/gui/kernel/qgesturemanager.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -129,7 +129,12 @@
 void QGestureManager::unregisterGestureRecognizer(Qt::GestureType type)
 {
     QList<QGestureRecognizer *> list = m_recognizers.values(type);
-    m_recognizers.remove(type);
+    while (QGestureRecognizer *recognizer = m_recognizers.take(type)) {
+        if (!m_obsoleteGestures.contains(recognizer)) {
+            // inserting even an empty QSet will cause the recognizer to be deleted on destruction of the manager
+            m_obsoleteGestures.insert(recognizer, QSet<QGesture *>());
+        }
+    }
     foreach (QGesture *g, m_gestureToRecognizer.keys()) {
         QGestureRecognizer *recognizer = m_gestureToRecognizer.value(g);
         if (list.contains(recognizer)) {
@@ -590,8 +595,9 @@
             if (gesture->hasHotSpot()) {
                 // guess the target widget using the hotspot of the gesture
                 QPoint pt = gesture->hotSpot().toPoint();
-                if (QWidget *w = qApp->topLevelAt(pt)) {
-                    target = w->childAt(w->mapFromGlobal(pt));
+                if (QWidget *topLevel = qApp->topLevelAt(pt)) {
+                    QWidget *child = topLevel->childAt(topLevel->mapFromGlobal(pt));
+                    target = child ? child : topLevel;
                 }
             } else {
                 // or use the context of the gesture