From d728bfe79349ff8da2a811270f2af3f5cacc6f95 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 7 Jun 2012 13:42:13 +0200 Subject: [PATCH] Windows: Store only full-size DC's obtained by BeginPaint. Avoid painting bugs in case the DC covers only a part of the window and QBackingStore does a full flush. Task-number: QTBUG-26039 Change-Id: Ic918d9898ac824690273ac59bcb1e7e546cc698a Reviewed-by: Miikka Heikkinen Reviewed-by: Friedemann Kleint --- .../platforms/windows/qwindowswindow.cpp | 19 ++++++++++++------- .../platforms/windows/qwindowswindow.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index fe38e60697..4e93d2b258 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -989,7 +989,7 @@ HDC QWindowsWindow::getDC() void QWindowsWindow::releaseDC() { - if (m_hdc && !testFlag(WithinWmPaint)) { + if (m_hdc && !testFlag(DCFromBeginPaint)) { ReleaseDC(handle(), m_hdc); m_hdc = 0; } @@ -1013,17 +1013,22 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message, QRegion(qrectFromRECT(ps.rcPaint))); EndPaint(hwnd, &ps); } else { - releaseDC(); - m_hdc = BeginPaint(hwnd, &ps); - setFlag(WithinWmPaint); - + const HDC dc = BeginPaint(hwnd, &ps); const QRect updateRect = qrectFromRECT(ps.rcPaint); + if (updateRect.size() == m_data.geometry.size()) { + // Store DC for access by the backing store if it has the full size. + releaseDC(); + setFlag(DCFromBeginPaint); + m_hdc = dc; + } if (QWindowsContext::verboseIntegration) qDebug() << __FUNCTION__ << this << window() << updateRect; QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRegion(updateRect)); - clearFlag(WithinWmPaint); - m_hdc = 0; + if (testFlag(DCFromBeginPaint)) { + clearFlag(DCFromBeginPaint); + m_hdc = 0; + } EndPaint(hwnd, &ps); } return true; diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 045da7d355..208c0d2c38 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -116,7 +116,7 @@ public: enum Flags { - WithinWmPaint = 0x1, + DCFromBeginPaint = 0x1, WithinSetParent = 0x2, FrameDirty = 0x4, //! Frame outdated by setStyle, recalculate in next query. OpenGLSurface = 0x10,