From: Dmitry Timoshkov Subject: [2/2] winex11.drv: Don't call ExcludeUpdateRgn for a window with WS_CLIPCHILDREN style. Message-Id: <20150629175407.77ddffeb.dmitry@baikal.ru> Date: Mon, 29 Jun 2015 17:54:07 +0800 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