Since we're checking the child window clipping rules it is possible that a toplevel window also has an onscreen client window, for instance if the window wasn't created with WS_CLIPCHILDREN. The last window to present between the parent and its children should be visible.
GDI blits always happen over the toplevel window, and we need to use IncludeInferiors to make sure it goes through any onscreen client window that is otherwise hiding the toplevel pixels.
It should be safe to use that flag wrt other child windows, as we also set the clipping region to exclude the area that should be obscured by any sibling.
From: Rémi Bernon rbernon@codeweavers.com
Since we're checking the child window clipping rules it is possible that a toplevel window also has an onscreen client window, for instance if the window wasn't created with WS_CLIPCHILDREN. The last window to present between the parent and its children should be visible.
GDI blits always happen over the toplevel window, and we need to use IncludeInferiors to make sure it goes through any onscreen client window that is otherwise hiding the toplevel pixels.
It should be safe to use that flag wrt other child windows, as we also set the clipping region to exclude the area that should be obscured by any sibling.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57661 --- dlls/winex11.drv/opengl.c | 2 +- dlls/winex11.drv/vulkan.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index b20e9282ce7..74f78482b41 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1912,7 +1912,7 @@ static void present_gl_drawable( HWND hwnd, HDC hdc, struct gl_drawable *gl, BOO }
if (get_dc_drawable( gl->hdc_dst, &rect ) != window || !EqualRect( &rect, &rect_dst )) - set_dc_drawable( gl->hdc_dst, window, &rect_dst, ClipByChildren ); + set_dc_drawable( gl->hdc_dst, window, &rect_dst, IncludeInferiors ); if (region) NtGdiExtSelectClipRgn( gl->hdc_dst, region, RGN_COPY );
NtGdiStretchBlt( gl->hdc_dst, 0, 0, rect_dst.right - rect_dst.left, rect_dst.bottom - rect_dst.top, diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index c0509bedc24..14711537636 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -239,7 +239,7 @@ static void X11DRV_vulkan_surface_presented( HWND hwnd, void *private, VkResult }
if (get_dc_drawable( surface->hdc_dst, &rect ) != window || !EqualRect( &rect, &rect_dst )) - set_dc_drawable( surface->hdc_dst, window, &rect_dst, ClipByChildren ); + set_dc_drawable( surface->hdc_dst, window, &rect_dst, IncludeInferiors ); if (region) NtGdiExtSelectClipRgn( surface->hdc_dst, region, RGN_COPY );
NtGdiStretchBlt( surface->hdc_dst, 0, 0, rect_dst.right - rect_dst.left, rect_dst.bottom - rect_dst.top,