Windows: More fine-grained paint event handling.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Thu, 27 Oct 2011 08:31:29 +0000 (10:31 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 27 Oct 2011 09:12:38 +0000 (11:12 +0200)
Pass expose events to GL widgets, handle invalid
update rectangles, ignore WM_ERASEBKND (using code from 4.8).

Change-Id: Ide062efb392292fff556d37b0ef0e880676748a2
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
src/plugins/platforms/windows/qwindowscontext.cpp
src/plugins/platforms/windows/qwindowswindow.cpp
src/plugins/platforms/windows/qwindowswindow.h

index d3ca496..92f764c 100644 (file)
@@ -680,8 +680,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
         }
         break;
     case QtWindows::ExposeEvent:
-        platformWindow->handleWmPaint(hwnd, message, wParam, lParam);
-        return true;
+        return platformWindow->handleWmPaint(hwnd, message, wParam, lParam);
     case QtWindows::MouseWheelEvent:
     case QtWindows::MouseEvent:
     case QtWindows::NonClientMouseEvent:
index ef5c2ae..21d02ab 100644 (file)
@@ -942,12 +942,22 @@ void QWindowsWindow::releaseDC()
     }
 }
 
-void QWindowsWindow::handleWmPaint(HWND hwnd, UINT,
+bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
                                          WPARAM, LPARAM)
 {
+    // Ignore invalid update bounding rectangles
+    if (!GetUpdateRect(m_data.hwnd, 0, FALSE))
+        return false;
+    if (message == WM_ERASEBKGND) // Backing store - ignored.
+        return true;
     PAINTSTRUCT ps;
     if (testFlag(OpenGLSurface)) {
-        BeginPaint(hwnd, &ps); // WM_ERASEBKGND needs to be handled.
+        // Observed painting problems with Aero style disabled (QTBUG-7865).
+        if (testFlag(OpenGLDoubleBuffered))
+            InvalidateRect(hwnd, 0, false);
+        BeginPaint(hwnd, &ps);
+        QWindowSystemInterface::handleSynchronousExposeEvent(window(),
+                                                             QRegion(qrectFromRECT(ps.rcPaint)));
         EndPaint(hwnd, &ps);
     } else {
         releaseDC();
@@ -963,6 +973,7 @@ void QWindowsWindow::handleWmPaint(HWND hwnd, UINT,
         m_hdc = 0;
         EndPaint(hwnd, &ps);
     }
+    return true;
 }
 
 void QWindowsWindow::setWindowTitle(const QString &title)
index 2aaf722..95e497a 100644 (file)
@@ -156,7 +156,7 @@ public:
         { return GetWindowLongPtr(m_data.hwnd, GWL_EXSTYLE); }
     void setExStyle(unsigned s) const;
 
-    void handleWmPaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+    bool handleWmPaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
 
     void handleMoved();
     void handleResized(int wParam);