summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qwidget.cpp4
-rw-r--r--src/widgets/kernel/qwidgetbackingstore.cpp105
-rw-r--r--src/widgets/kernel/qwidgetbackingstore_p.h20
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);