From 8c81b282f8e18897257b93cb3fc149d74441c40e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 2 Apr 2013 16:21:35 +0200 Subject: Widgets: Propagate 'accepted'-state of touch begin events. Task-number: QTBUG-29946 Change-Id: Ia9ac54251f52b6ae4b3d667e49b96441def72a57 Reviewed-by: Shawn Rutledge --- src/widgets/kernel/qapplication.cpp | 15 ++++++++++----- src/widgets/kernel/qapplication_p.h | 2 +- src/widgets/kernel/qwidgetwindow.cpp | 8 +++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 02fcfde59e..d036f6bada 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -3837,7 +3837,7 @@ bool QApplicationPrivate::translateTouchToMouse(QWidget *widget, QTouchEvent *ev return false; } -void QApplicationPrivate::translateRawTouchEvent(QWidget *window, +bool QApplicationPrivate::translateRawTouchEvent(QWidget *window, QTouchDevice *device, const QList &touchPoints, ulong timestamp) @@ -3899,8 +3899,9 @@ void QApplicationPrivate::translateRawTouchEvent(QWidget *window, } if (widgetsNeedingEvents.isEmpty()) - return; + return false; + bool accepted = false; QHash::ConstIterator it = widgetsNeedingEvents.constBegin(); const QHash::ConstIterator end = widgetsNeedingEvents.constEnd(); for (; it != end; ++it) { @@ -3939,19 +3940,23 @@ void QApplicationPrivate::translateRawTouchEvent(QWidget *window, { // if the TouchBegin handler recurses, we assume that means the event // has been implicitly accepted and continue to send touch events - widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent); - (void ) QApplication::sendSpontaneousEvent(widget, &touchEvent); + if (QApplication::sendSpontaneousEvent(widget, &touchEvent) && touchEvent.isAccepted()) { + accepted = true; + widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent); + } break; } default: if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)) { if (touchEvent.type() == QEvent::TouchEnd) widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, false); - (void) QApplication::sendSpontaneousEvent(widget, &touchEvent); + if (QApplication::sendSpontaneousEvent(widget, &touchEvent) && touchEvent.isAccepted()) + accepted = true; } break; } } + return accepted; } void QApplicationPrivate::translateTouchCancel(QTouchDevice *device, ulong timestamp) diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index ca1bccb727..87cf259ba5 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -284,7 +284,7 @@ public: void appendTouchPoint(const QTouchEvent::TouchPoint &touchPoint); void removeTouchPoint(int touchPointId); bool translateTouchToMouse(QWidget *widget, QTouchEvent *event); - static void translateRawTouchEvent(QWidget *widget, + static bool translateRawTouchEvent(QWidget *widget, QTouchDevice *device, const QList &touchPoints, ulong timestamp); diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index ddb570d6c7..bedcfe78bf 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -473,10 +473,12 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) void QWidgetWindow::handleTouchEvent(QTouchEvent *event) { - if (event->type() == QEvent::TouchCancel) + if (event->type() == QEvent::TouchCancel) { QApplicationPrivate::translateTouchCancel(event->device(), event->timestamp()); - else - QApplicationPrivate::translateRawTouchEvent(m_widget, event->device(), event->touchPoints(), event->timestamp()); + event->accept(); + } else { + event->setAccepted(QApplicationPrivate::translateRawTouchEvent(m_widget, event->device(), event->touchPoints(), event->timestamp())); + } } void QWidgetWindow::handleKeyEvent(QKeyEvent *event) -- cgit v1.2.3