diff options
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 4 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore.cpp | 105 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore_p.h | 20 |
3 files changed, 73 insertions, 56 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index ba8147c4a6..e2c766ea4c 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -9888,7 +9888,7 @@ void QWidget::repaint(const QRect &rect) QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; - tlwExtra->backingStoreTracker->markDirty(rect, this, true); + tlwExtra->backingStoreTracker->markDirty(rect, this, QWidgetBackingStore::UpdateNow); tlwExtra->inRepaint = false; } } else { @@ -9917,7 +9917,7 @@ void QWidget::repaint(const QRegion &rgn) QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; - tlwExtra->backingStoreTracker->markDirty(rgn, this, true); + tlwExtra->backingStoreTracker->markDirty(rgn, this, QWidgetBackingStore::UpdateNow); tlwExtra->inRepaint = false; } } else { diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 43e2ccdf0b..fe877758ef 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -443,17 +443,21 @@ QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &within return region; } -void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, bool updateImmediately) +void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTime) { if (!widget) return; - if (updateImmediately) { - QEvent event(QEvent::UpdateRequest); - QApplication::sendEvent(widget, &event); - } else { + switch (updateTime) { + case UpdateLater: updateRequestSent = true; QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority); + break; + case UpdateNow: { + QEvent event(QEvent::UpdateRequest); + QApplication::sendEvent(widget, &event); + break; + } } } @@ -461,17 +465,17 @@ void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, bool updateImmediat Marks the region of the widget as dirty (if not already marked as dirty) and posts an UpdateRequest event to the top-level widget (if not already posted). - If updateImmediately is true, the event is sent immediately instead of posted. + If updateTime is UpdateNow, the event is sent immediately instead of posted. - If invalidateBuffer is true, all widgets intersecting with the region will be dirty. + If bufferState is BufferInvalid, all widgets intersecting with the region will be dirty. If the widget paints directly on screen, the event is sent to the widget - instead of the top-level widget, and invalidateBuffer is completely ignored. + instead of the top-level widget, and bufferState is completely ignored. ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore). */ -void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately, - bool invalidateBuffer) +void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, + UpdateTime updateTime, BufferState bufferState) { Q_ASSERT(tlw->d_func()->extra); Q_ASSERT(tlw->d_func()->extra->topextra); @@ -487,44 +491,44 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up if (widget->d_func()->paintOnScreen()) { if (widget->d_func()->dirty.isEmpty()) { widget->d_func()->dirty = rgn; - sendUpdateRequest(widget, updateImmediately); + sendUpdateRequest(widget, updateTime); return; } else if (qt_region_strictContains(widget->d_func()->dirty, widget->rect())) { - if (updateImmediately) - sendUpdateRequest(widget, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(widget, updateTime); return; // Already dirty. } const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty(); widget->d_func()->dirty += rgn; - if (!eventAlreadyPosted || updateImmediately) - sendUpdateRequest(widget, updateImmediately); + if (!eventAlreadyPosted || updateTime == UpdateNow) + sendUpdateRequest(widget, updateTime); return; } //### FIXME fullUpdatePending seems to be always false???? if (fullUpdatePending) { - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } const QPoint offset = widget->mapTo(tlw, QPoint()); if (QWidgetPrivate::get(widget)->renderToTexture) { - if (!updateRequestSent || updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (!updateRequestSent || updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } const QRect widgetRect = widget->d_func()->effectiveRectFor(widget->rect()); if (qt_region_strictContains(dirty, widgetRect.translated(offset))) { - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; // Already dirty. } - if (invalidateBuffer) { + if (bufferState == BufferInvalid) { const bool eventAlreadyPosted = !dirty.isEmpty() || updateRequestSent; #ifndef QT_NO_GRAPHICSEFFECT if (widget->d_func()->graphicsEffect) @@ -532,14 +536,14 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up else #endif //QT_NO_GRAPHICSEFFECT dirty += rgn.translated(offset); - if (!eventAlreadyPosted || updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (!eventAlreadyPosted || updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } if (dirtyWidgets.isEmpty()) { addDirtyWidget(widget, rgn); - sendUpdateRequest(tlw, updateImmediately); + sendUpdateRequest(tlw, updateTime); return; } @@ -556,8 +560,8 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up addDirtyWidget(widget, rgn); } - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); } /*! @@ -567,8 +571,8 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore). */ -void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool updateImmediately, - bool invalidateBuffer) +void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, + UpdateTime updateTime, BufferState bufferState) { Q_ASSERT(tlw->d_func()->extra); Q_ASSERT(tlw->d_func()->extra->topextra); @@ -584,30 +588,30 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd if (widget->d_func()->paintOnScreen()) { if (widget->d_func()->dirty.isEmpty()) { widget->d_func()->dirty = QRegion(rect); - sendUpdateRequest(widget, updateImmediately); + sendUpdateRequest(widget, updateTime); return; } else if (qt_region_strictContains(widget->d_func()->dirty, rect)) { - if (updateImmediately) - sendUpdateRequest(widget, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(widget, updateTime); return; // Already dirty. } const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty(); widget->d_func()->dirty += rect; - if (!eventAlreadyPosted || updateImmediately) - sendUpdateRequest(widget, updateImmediately); + if (!eventAlreadyPosted || updateTime == UpdateNow) + sendUpdateRequest(widget, updateTime); return; } if (fullUpdatePending) { - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } if (QWidgetPrivate::get(widget)->renderToTexture) { - if (!updateRequestSent || updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (!updateRequestSent || updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } @@ -615,22 +619,22 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd const QRect widgetRect = widget->d_func()->effectiveRectFor(rect); const QRect translatedRect(widgetRect.translated(widget->mapTo(tlw, QPoint()))); if (qt_region_strictContains(dirty, translatedRect)) { - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; // Already dirty } - if (invalidateBuffer) { + if (bufferState == BufferInvalid) { const bool eventAlreadyPosted = !dirty.isEmpty(); dirty += translatedRect; - if (!eventAlreadyPosted || updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (!eventAlreadyPosted || updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); return; } if (dirtyWidgets.isEmpty()) { addDirtyWidget(widget, rect); - sendUpdateRequest(tlw, updateImmediately); + sendUpdateRequest(tlw, updateTime); return; } @@ -641,8 +645,8 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd addDirtyWidget(widget, rect); } - if (updateImmediately) - sendUpdateRequest(tlw, updateImmediately); + if (updateTime == UpdateNow) + sendUpdateRequest(tlw, updateTime); } /*! @@ -1346,7 +1350,8 @@ void QWidgetPrivate::invalidateBuffer(const QRegion &rgn) if (wrgn.isEmpty()) return; - tlwExtra->backingStoreTracker->markDirty(wrgn, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wrgn, q, + QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid); } /*! @@ -1370,7 +1375,8 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect) return; if (graphicsEffect || !extra || !extra->hasMask) { - tlwExtra->backingStoreTracker->markDirty(wRect, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wRect, q, + QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid); return; } @@ -1379,7 +1385,8 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect) if (wRgn.isEmpty()) return; - tlwExtra->backingStoreTracker->markDirty(wRgn, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wRgn, q, + QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid); } void QWidgetPrivate::repaint_sys(const QRegion &rgn) diff --git a/src/widgets/kernel/qwidgetbackingstore_p.h b/src/widgets/kernel/qwidgetbackingstore_p.h index e362ee4ac1..473e9deef4 100644 --- a/src/widgets/kernel/qwidgetbackingstore_p.h +++ b/src/widgets/kernel/qwidgetbackingstore_p.h @@ -93,6 +93,16 @@ private: class Q_AUTOTEST_EXPORT QWidgetBackingStore { public: + enum UpdateTime { + UpdateNow, + UpdateLater + }; + + enum BufferState{ + BufferValid, + BufferInvalid + }; + QWidgetBackingStore(QWidget *t); ~QWidgetBackingStore(); @@ -112,10 +122,10 @@ public: } // ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore). - void markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately = false, - bool invalidateBuffer = false); - void markDirty(const QRect &rect, QWidget *widget, bool updateImmediately = false, - bool invalidateBuffer = false); + void markDirty(const QRegion &rgn, QWidget *widget, UpdateTime updateTime = UpdateLater, + BufferState bufferState = BufferValid); + void markDirty(const QRect &rect, QWidget *widget, UpdateTime updateTime = UpdateLater, + BufferState bufferState = BufferValid); private: QWidget *tlw; @@ -134,7 +144,7 @@ private: QPlatformTextureListWatcher *textureListWatcher; - void sendUpdateRequest(QWidget *widget, bool updateImmediately); + void sendUpdateRequest(QWidget *widget, UpdateTime updateTime); static bool flushPaint(QWidget *widget, const QRegion &rgn); static void unflushPaint(QWidget *widget, const QRegion &rgn); |