From 73a0bca60630abe73deaab49ce310e2537a31abb Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Wed, 6 May 2009 17:28:20 +0200 Subject: Oops, we should replay mouse events to the same widget that was supposed to receive them. --- src/gui/kernel/qgesturemanager.cpp | 40 +++++++++++++++++++++++--------------- src/gui/kernel/qgesturemanager_p.h | 2 ++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index fd1eaca..ef4b3d0 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -67,7 +67,7 @@ static const unsigned int MaximumGestureRecognitionTimeout = 2000; QGestureManager::QGestureManager(QObject *parent) : QObject(parent), targetWidget(0), eventDeliveryDelayTimeout(300), - delayedPressTimer(0), lastMousePressEvent(QEvent::None, QPoint(), Qt::NoButton, 0, 0), + delayedPressTimer(0), lastMousePressReceiver(0), lastMousePressEvent(QEvent::None, QPoint(), Qt::NoButton, 0, 0), lastGestureId(0), state(NotGesture) { qRegisterMetaType(); @@ -97,11 +97,12 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) { if (state != Gesture) { // find the target widget - while (receiver && receiver->d_func()->gestures.isEmpty()) - receiver = receiver->parentWidget(); - if (!receiver) // no widget in the tree that accepts gestures. + QWidget *w = receiver; + while (w && w->d_func()->gestures.isEmpty()) + w = w->parentWidget(); + if (!w) // no widget in the tree that accepts gestures. return false; - targetWidget = receiver; + targetWidget = w; } QPoint currentPos; @@ -316,6 +317,7 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) DEBUG() << "QGestureManager: gesture started. Forgetting about postponed mouse press event"; killTimer(delayedPressTimer); delayedPressTimer = 0; + lastMousePressReceiver = 0; } else if (delayedPressTimer && (state == NotGesture || event->type() == QEvent::MouseButtonRelease)) { // not a gesture or released button too fast, so replay press @@ -330,14 +332,16 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) maybeGestures.clear(); state = NotGesture; - Q_ASSERT(targetWidget != 0); - QApplication::sendEvent(targetWidget, &lastMousePressEvent); - if (event->type() == QEvent::MouseButtonRelease) { - QMouseEvent *me = static_cast(event); - QMouseEvent move(QEvent::MouseMove, me->pos(), me->globalPos(), me->button(), - me->buttons(), me->modifiers()); - QApplication::sendEvent(targetWidget, &move); - ret = false; + if (lastMousePressReceiver) { + QApplication::sendEvent(lastMousePressReceiver, &lastMousePressEvent); + if (event->type() == QEvent::MouseButtonRelease) { + QMouseEvent *me = static_cast(event); + QMouseEvent move(QEvent::MouseMove, me->pos(), me->globalPos(), me->button(), + me->buttons(), me->modifiers()); + QApplication::sendEvent(lastMousePressReceiver, &move); + ret = false; + } + lastMousePressReceiver = 0; } killTimer(delayedPressTimer); delayedPressTimer = 0; @@ -347,6 +351,7 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) // sure whether it is a gesture. DEBUG() << "QGestureManager: postponing mouse press event"; QMouseEvent *me = static_cast(event); + lastMousePressReceiver = receiver; lastMousePressEvent = QMouseEvent(QEvent::MouseButtonPress, me->pos(), me->globalPos(), me->button(), me->buttons(), me->modifiers()); @@ -382,9 +387,12 @@ void QGestureManager::timerEvent(QTimerEvent *event) maybeGestures.clear(); state = NotGesture; - // we neither received a mouse release event nor gesture - // started, so we replay stored mouse press event. - QApplication::sendEvent(targetWidget, &lastMousePressEvent); + if (lastMousePressReceiver) { + // we neither received a mouse release event nor gesture + // started, so we replay stored mouse press event. + QApplication::sendEvent(lastMousePressReceiver, &lastMousePressEvent); + lastMousePressReceiver = 0; + } killTimer(delayedPressTimer); delayedPressTimer = 0; diff --git a/src/gui/kernel/qgesturemanager_p.h b/src/gui/kernel/qgesturemanager_p.h index 6de3baa..2b86fcd 100644 --- a/src/gui/kernel/qgesturemanager_p.h +++ b/src/gui/kernel/qgesturemanager_p.h @@ -57,6 +57,7 @@ #include "qset.h" #include "qevent.h" #include "qbasictimer.h" +#include "qpointer.h" #include "qgesturerecognizer.h" @@ -105,6 +106,7 @@ private: int eventDeliveryDelayTimeout; int delayedPressTimer; + QPointer lastMousePressReceiver; QMouseEvent lastMousePressEvent; QMap gestureIdMap; -- cgit v0.12