diff options
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 27 | ||||
-rw-r--r-- | src/widgets/kernel/qgesturemanager.cpp | 6 | ||||
-rw-r--r-- | src/widgets/kernel/qgesturemanager_p.h | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qstandardgestures.cpp | 35 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 29 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_p.h | 4 |
6 files changed, 41 insertions, 61 deletions
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 92d3359909..8d0a51606e 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2867,16 +2867,19 @@ bool QApplication::notify(QObject *receiver, QEvent *e) case QEvent::NetworkReplyUpdated: break; default: - if (receiver->isWidgetType()) { - if (d->gestureManager->filterEvent(static_cast<QWidget *>(receiver), e)) - return true; - } else { - // a special case for events that go to QGesture objects. - // We pass the object to the gesture manager and it'll figure - // out if it's QGesture or not. - if (d->gestureManager->filterEvent(receiver, e)) - return true; + if (d->gestureManager->thread() == QThread::currentThread()) { + if (receiver->isWidgetType()) { + if (d->gestureManager->filterEvent(static_cast<QWidget *>(receiver), e)) + return true; + } else { + // a special case for events that go to QGesture objects. + // We pass the object to the gesture manager and it'll figure + // out if it's QGesture or not. + if (d->gestureManager->filterEvent(receiver, e)) + return true; + } } + break; } } #endif // QT_NO_GESTURES @@ -3976,7 +3979,11 @@ bool QApplicationPrivate::translateRawTouchEvent(QWidget *window, break; } default: - if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)) { + if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent) +#ifndef QT_NO_GESTURES + || QGestureManager::gesturePending(widget) +#endif + ) { if (touchEvent.type() == QEvent::TouchEnd) widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, false); if (QApplication::sendSpontaneousEvent(widget, &touchEvent) && touchEvent.isAccepted()) diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp index 18abad4b40..929e5e2fcf 100644 --- a/src/widgets/kernel/qgesturemanager.cpp +++ b/src/widgets/kernel/qgesturemanager.cpp @@ -718,6 +718,12 @@ void QGestureManager::recycle(QGesture *gesture) } } +bool QGestureManager::gesturePending(QObject *o) +{ + const QGestureManager *gm = QGestureManager::instance(); + return gm && gm->m_gestureOwners.key(o); +} + QT_END_NAMESPACE #endif // QT_NO_GESTURES diff --git a/src/widgets/kernel/qgesturemanager_p.h b/src/widgets/kernel/qgesturemanager_p.h index 4ab631a921..6264b5a25d 100644 --- a/src/widgets/kernel/qgesturemanager_p.h +++ b/src/widgets/kernel/qgesturemanager_p.h @@ -81,6 +81,7 @@ public: #endif //QT_NO_GRAPHICSVIEW static QGestureManager* instance(); // declared in qapplication.cpp + static bool gesturePending(QObject *o); void cleanupCachedGestures(QObject *target, Qt::GestureType type); diff --git a/src/widgets/kernel/qstandardgestures.cpp b/src/widgets/kernel/qstandardgestures.cpp index e3fd6404db..64ab68257a 100644 --- a/src/widgets/kernel/qstandardgestures.cpp +++ b/src/widgets/kernel/qstandardgestures.cpp @@ -77,11 +77,10 @@ QGestureRecognizer::Result QPanGestureRecognizer::recognize(QGesture *state, QPanGesture *q = static_cast<QPanGesture *>(state); QPanGesturePrivate *d = q->d_func(); - const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); - - QGestureRecognizer::Result result; + QGestureRecognizer::Result result = QGestureRecognizer::Ignore; switch (event->type()) { case QEvent::TouchBegin: { + const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); result = QGestureRecognizer::MayBeGesture; QTouchEvent::TouchPoint p = ev->touchPoints().at(0); d->lastOffset = d->offset = QPointF(); @@ -89,6 +88,7 @@ QGestureRecognizer::Result QPanGestureRecognizer::recognize(QGesture *state, } case QEvent::TouchEnd: { if (q->state() != Qt::NoGesture) { + const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); if (ev->touchPoints().size() == 2) { QTouchEvent::TouchPoint p1 = ev->touchPoints().at(0); QTouchEvent::TouchPoint p2 = ev->touchPoints().at(1); @@ -104,6 +104,7 @@ QGestureRecognizer::Result QPanGestureRecognizer::recognize(QGesture *state, break; } case QEvent::TouchUpdate: { + const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); if (ev->touchPoints().size() >= 2) { QTouchEvent::TouchPoint p1 = ev->touchPoints().at(0); QTouchEvent::TouchPoint p2 = ev->touchPoints().at(1); @@ -121,13 +122,7 @@ QGestureRecognizer::Result QPanGestureRecognizer::recognize(QGesture *state, } break; } - case QEvent::MouseButtonPress: - case QEvent::MouseMove: - case QEvent::MouseButtonRelease: - result = QGestureRecognizer::Ignore; - break; default: - result = QGestureRecognizer::Ignore; break; } return result; @@ -168,9 +163,7 @@ QGestureRecognizer::Result QPinchGestureRecognizer::recognize(QGesture *state, QPinchGesture *q = static_cast<QPinchGesture *>(state); QPinchGesturePrivate *d = q->d_func(); - const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); - - QGestureRecognizer::Result result; + QGestureRecognizer::Result result = QGestureRecognizer::Ignore; switch (event->type()) { case QEvent::TouchBegin: { @@ -186,6 +179,7 @@ QGestureRecognizer::Result QPinchGestureRecognizer::recognize(QGesture *state, break; } case QEvent::TouchUpdate: { + const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); d->changeFlags = 0; if (ev->touchPoints().size() == 2) { QTouchEvent::TouchPoint p1 = ev->touchPoints().at(0); @@ -245,13 +239,7 @@ QGestureRecognizer::Result QPinchGestureRecognizer::recognize(QGesture *state, } break; } - case QEvent::MouseButtonPress: - case QEvent::MouseMove: - case QEvent::MouseButtonRelease: - result = QGestureRecognizer::Ignore; - break; default: - result = QGestureRecognizer::Ignore; break; } return result; @@ -297,9 +285,7 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state, QSwipeGesture *q = static_cast<QSwipeGesture *>(state); QSwipeGesturePrivate *d = q->d_func(); - const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); - - QGestureRecognizer::Result result; + QGestureRecognizer::Result result = QGestureRecognizer::Ignore; switch (event->type()) { case QEvent::TouchBegin: { @@ -318,6 +304,7 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state, break; } case QEvent::TouchUpdate: { + const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); if (!d->started) result = QGestureRecognizer::CancelGesture; else if (ev->touchPoints().size() == 3) { @@ -384,13 +371,7 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state, } break; } - case QEvent::MouseButtonPress: - case QEvent::MouseMove: - case QEvent::MouseButtonRelease: - result = QGestureRecognizer::Ignore; - break; default: - result = QGestureRecognizer::Ignore; break; } return result; diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 8db5666d85..569828c44d 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -4681,7 +4681,8 @@ void QWidget::unsetCursor() void QWidget::render(QPaintDevice *target, const QPoint &targetOffset, const QRegion &sourceRegion, RenderFlags renderFlags) { - d_func()->render(target, targetOffset, sourceRegion, renderFlags, false); + QPainter p(target); + render(&p, targetOffset, sourceRegion, renderFlags); } /*! @@ -4725,9 +4726,6 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, d->createExtra(); d->extra->inRenderWithPainter = true; -#ifdef Q_WS_MAC - d->render_helper(painter, targetOffset, toBePainted, renderFlags); -#else QPaintEngine *engine = painter->paintEngine(); Q_ASSERT(engine); QPaintEnginePrivate *enginePriv = engine->d_func(); @@ -4738,7 +4736,7 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, // Render via a pixmap when dealing with non-opaque painters or printers. if (!inRenderWithPainter && (opacity < 1.0 || (target->devType() == QInternal::Printer))) { d->render_helper(painter, targetOffset, toBePainted, renderFlags); - d->extra->inRenderWithPainter = false; + d->extra->inRenderWithPainter = inRenderWithPainter; return; } @@ -4759,7 +4757,7 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, enginePriv->setSystemViewport(oldSystemClip); } - render(target, targetOffset, toBePainted, renderFlags); + d->render(target, targetOffset, toBePainted, renderFlags); // Restore system clip, viewport and transform. enginePriv->systemClip = oldSystemClip; @@ -4768,9 +4766,8 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, // Restore shared painter. d->setSharedPainter(oldPainter); -#endif - d->extra->inRenderWithPainter = false; + d->extra->inRenderWithPainter = inRenderWithPainter; } static void sendResizeEvents(QWidget *target) @@ -5208,8 +5205,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, - const QRegion &sourceRegion, QWidget::RenderFlags renderFlags, - bool readyToRender) + const QRegion &sourceRegion, QWidget::RenderFlags renderFlags) { if (!target) { qWarning("QWidget::render: null pointer to paint device"); @@ -5217,7 +5213,7 @@ void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, } const bool inRenderWithPainter = extra && extra->inRenderWithPainter; - QRegion paintRegion = !inRenderWithPainter && !readyToRender + QRegion paintRegion = !inRenderWithPainter ? prepareToRender(sourceRegion, renderFlags) : sourceRegion; if (paintRegion.isEmpty()) @@ -5276,23 +5272,12 @@ void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, flags |= DontSetCompositionMode; - if (target->devType() == QInternal::Printer) { - QPainter p(target); - render_helper(&p, targetOffset, paintRegion, renderFlags); - return; - } - -#ifndef Q_WS_MAC // Render via backingstore. drawWidget(target, paintRegion, offset, flags, sharedPainter()); // Restore shared painter. if (oldSharedPainter) setSharedPainter(oldSharedPainter); -#else - // Render via backingstore (no shared painter). - drawWidget(target, paintRegion, offset, flags, 0); -#endif } void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectList& siblings, int index, const QRegion &rgn, diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index bdfc57f7c3..99cba0e20f 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -389,7 +389,7 @@ public: void render_helper(QPainter *painter, const QPoint &targetOffset, const QRegion &sourceRegion, QWidget::RenderFlags renderFlags); void render(QPaintDevice *target, const QPoint &targetOffset, const QRegion &sourceRegion, - QWidget::RenderFlags renderFlags, bool readyToRender); + QWidget::RenderFlags renderFlags); void drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QPoint &offset, int flags, QPainter *sharedPainter = 0, QWidgetBackingStore *backingStore = 0); @@ -628,7 +628,7 @@ public: #ifndef QT_NO_OPENGL virtual GLuint textureId() const { return 0; } - void setRenderToTexture() { renderToTexture = true; textureChildSeen = true; } + void setRenderToTexture() { renderToTexture = true; setTextureChildSeen(); } void setTextureChildSeen() { Q_Q(QWidget); |