summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-08-26 22:08:59 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-09-20 11:45:41 +0000
commit1e310b5a4508f25a59f0e54aea8636f38f17db44 (patch)
tree629509df76f6b003557cde4f27d22d10883c6ae0
parent9a322dfdea1cf331d2308034a63bf261f65f62c0 (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.cpp7
-rw-r--r--src/widgets/kernel/qwidgetbackingstore.cpp9
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 &region, 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 &region, 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;
}