diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2019-08-26 22:08:59 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2019-09-20 11:45:41 +0000 |
commit | 1e310b5a4508f25a59f0e54aea8636f38f17db44 (patch) | |
tree | 629509df76f6b003557cde4f27d22d10883c6ae0 | |
parent | 9a322dfdea1cf331d2308034a63bf261f65f62c0 (diff) |
widgets: Mark widgets as needing flush during painting
Except for the case of syncing in response to an expose event,
where the platform asked us to flush a specific region, we
should strive to only flush parts that have been repainted.
And we should flush those parts to their nearest native child,
instead of unconditionally flushing the root/top level widget
as well.
By allowing drawWidget to schedule the flush we automatically
flush the minimal region, to the right widgets.
(manually cherry-picked from commit 79bf1b7e348d186934b14c417859a48bf9b3a06c)
Task-number: QTBUG-77447
Change-Id: I1a8fa703c0b7172655271e2a8f5eca694cb14129
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 7 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore.cpp | 9 |
2 files changed, 4 insertions, 12 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index bf339ca5c5..f5cc6bb853 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -5520,9 +5520,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } sourced->context = 0; - // Native widgets need to be marked dirty on screen so painting will be done in correct context - // Same check as in the no effects case below. - if (backingStore && !onScreen && !asRoot && (q->internalWinId() || !q->nativeParentWidget()->isWindow())) + if (backingStore) backingStore->markDirtyOnScreen(rgn, q, offset); return; @@ -5641,8 +5639,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP sendPaintEvent(toBePainted); } - // Native widgets need to be marked dirty on screen so painting will be done in correct context - if (backingStore && !onScreen && !asRoot && (q->internalWinId() || (q->nativeParentWidget() && !q->nativeParentWidget()->isWindow()))) + if (backingStore) backingStore->markDirtyOnScreen(toBePainted, q, offset); //restore diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 24b8665013..b9505a6ed0 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -333,9 +333,6 @@ void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QBacking Q_UNUSED(widget); Q_UNUSED(toCleanIsInTopLevelCoordinates); - // Always flush repainted areas. - dirtyOnScreen += toClean; - #ifdef QT_NO_PAINT_DEBUG backingStore->beginPaint(toClean); #else @@ -714,8 +711,7 @@ void QWidgetBackingStore::markDirtyOnScreen(const QRegion ®ion, QWidget *widg // Top-level. if (widget == tlw) { - if (!widget->testAttribute(Qt::WA_WState_InPaintEvent)) - dirtyOnScreen += region; + dirtyOnScreen += region; return; } @@ -723,8 +719,7 @@ void QWidgetBackingStore::markDirtyOnScreen(const QRegion ®ion, QWidget *widg if (!hasPlatformWindow(widget) && !widget->isWindow()) { QWidget *nativeParent = widget->nativeParentWidget(); // Alien widgets with the top-level as the native parent (common case). if (nativeParent == tlw) { - if (!widget->testAttribute(Qt::WA_WState_InPaintEvent)) - dirtyOnScreen += region.translated(topLevelOffset); + dirtyOnScreen += region.translated(topLevelOffset); return; } |