Check whether exposed widget is mapped in QWidgetBackingStore::sync(QWidget*).

Qt::WA_Mapped corresponds to 'exposed' in Qt 5, hence a parent window
fully obscured by its children may not have the attribute set.
In that case, go by the attribute of the child widget.

Task-number: QTBUG-33520

Change-Id: Ia08f283172daaa58f58e5636004461b2c48784f7
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
bb10
Friedemann Kleint 2013-11-26 12:09:42 +02:00 committed by The Qt Project
parent 4beafcd944
commit 5adba7cba7
2 changed files with 11 additions and 4 deletions

View File

@ -892,10 +892,10 @@ static inline bool discardSyncRequest(QWidget *tlw, QTLWExtra *tlwExtra)
void QWidgetBackingStore::sync(QWidget *exposedWidget, const QRegion &exposedRegion)
{
QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();
if (discardSyncRequest(tlw, tlwExtra) || tlwExtra->inTopLevelResize)
if (!tlw->isVisible() || !tlwExtra || tlwExtra->inTopLevelResize)
return;
if (!exposedWidget || !exposedWidget->internalWinId() || !exposedWidget->isVisible()
if (!exposedWidget || !exposedWidget->internalWinId() || !exposedWidget->isVisible() || !exposedWidget->testAttribute(Qt::WA_Mapped)
|| !exposedWidget->updatesEnabled() || exposedRegion.isEmpty()) {
return;
}
@ -910,7 +910,8 @@ void QWidgetBackingStore::sync(QWidget *exposedWidget, const QRegion &exposedReg
markDirtyOnScreen(exposedRegion, exposedWidget, exposedWidget->mapTo(tlw, QPoint()));
else
markDirtyOnScreen(exposedRegion, exposedWidget, QPoint());
sync();
doSync();
}
/*!
@ -935,10 +936,15 @@ void QWidgetBackingStore::sync()
return;
}
doSync();
}
void QWidgetBackingStore::doSync()
{
const bool updatesDisabled = !tlw->updatesEnabled();
bool repaintAllWidgets = false;
const bool inTopLevelResize = tlwExtra->inTopLevelResize;
const bool inTopLevelResize = tlw->d_func()->maybeTopData()->inTopLevelResize;
const QRect tlwRect(topLevelRect());
const QRect surfaceGeometry(tlwRect.topLeft(), store->size());
if ((fullUpdatePending || inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) && !updatesDisabled) {

View File

@ -110,6 +110,7 @@ private:
static bool flushPaint(QWidget *widget, const QRegion &rgn);
static void unflushPaint(QWidget *widget, const QRegion &rgn);
void doSync();
bool bltRect(const QRect &rect, int dx, int dy, QWidget *widget);
void releaseBuffer();