summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-06-07 13:42:13 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-07 17:13:38 +0200
commitd728bfe79349ff8da2a811270f2af3f5cacc6f95 (patch)
tree454d8c077559a1840a41b470413aeb00842336dd /src/plugins/platforms
parent6b95e54f1f99875054b54df6a16233c2a44810b4 (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/plugins/platforms')
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp19
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h2
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,