[2/2] winex11.drv: Don't call ExcludeUpdateRgn for a window with WS_CLIPCHILDREN style.

Dmitry Timoshkov dmitry at baikal.ru
Mon Jun 29 04:54:07 CDT 2015


WS_CLIPCHILDREN doesn't exclude children from windows' update region,
and ExcludeUpdateRgn call may inappropriately clip valid child window
contents from the copied parent window bits, but we still want to avoid
copying invalid window bits when possible.

This patch fixes huge window painting artifacts in the application
I have here, it also fixes a test application attached to the bug 38832.
---
 dlls/winex11.drv/window.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 14dc44c..90da798 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1335,7 +1335,13 @@ static void move_window_bits( HWND hwnd, Window window, const RECT *old_rect, co
     rgn = CreateRectRgnIndirect( &dst_rect );
     SelectClipRgn( hdc_dst, rgn );
     DeleteObject( rgn );
-    ExcludeUpdateRgn( hdc_dst, hwnd );
+    /* WS_CLIPCHILDREN doesn't exclude children from windows' update
+     * region, and ExcludeUpdateRgn call may inappropriately clip valid
+     * child window contents from the copied parent window bits, but we
+     * still want to avoid copying invalid window bits when possible.
+     */
+    if (!(GetWindowLongW( hwnd, GWL_STYLE ) & WS_CLIPCHILDREN ))
+        ExcludeUpdateRgn( hdc_dst, hwnd );
 
     code = X11DRV_START_EXPOSURES;
     ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
-- 
2.4.5




More information about the wine-patches mailing list