diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-06-07 13:42:13 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-07 17:13:38 +0200 |
commit | d728bfe79349ff8da2a811270f2af3f5cacc6f95 (patch) | |
tree | 454d8c077559a1840a41b470413aeb00842336dd /src | |
parent | 6b95e54f1f99875054b54df6a16233c2a44810b4 (diff) |
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 <miikka.heikkinen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 19 | ||||
-rw-r--r-- | src/plugins/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, |