summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/kernel/qgesturemanager.cpp40
-rw-r--r--src/gui/kernel/qgesturemanager_p.h2
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<Qt::DirectionType>();
@@ -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<QMouseEvent*>(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<QMouseEvent*>(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<QMouseEvent*>(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<QWidget> lastMousePressReceiver;
QMouseEvent lastMousePressEvent;
QMap<int, QString> gestureIdMap;