From aa4778413025a5b93695cd97ab39fc77e3e838fe Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Mon, 1 Feb 2010 22:35:32 +0100
Subject: [PATCH] winex11: Synchronize the shaped flag with the window region
 before determining the window size.

---
 dlls/winex11.drv/window.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index ec7f6dd7293..1dfecceeee8 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1444,6 +1444,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
     COLORREF key;
     BYTE alpha;
     DWORD layered_flags;
+    HRGN win_rgn;
 
     if (!data->managed && is_window_managed( data->hwnd, SWP_NOACTIVATE, &data->window_rect ))
     {
@@ -1452,6 +1453,14 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
         SetPropA( data->hwnd, managed_prop, (HANDLE)1 );
     }
 
+    if ((win_rgn = CreateRectRgn( 0, 0, 0, 0 )) &&
+        GetWindowRgn( data->hwnd, win_rgn ) == ERROR)
+    {
+        DeleteObject( win_rgn );
+        win_rgn = 0;
+    }
+    data->shaped = (win_rgn != 0);
+
     mask = get_window_attributes( display, data, &attr );
 
     data->whole_rect = data->window_rect;
@@ -1471,7 +1480,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
     if (data->whole_window) XSaveContext( display, data->whole_window, winContext, (char *)data->hwnd );
     wine_tsx11_unlock();
 
-    if (!data->whole_window) return 0;
+    if (!data->whole_window) goto done;
 
     if (!create_client_window( display, data, NULL ))
     {
@@ -1480,7 +1489,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
         XDestroyWindow( display, data->whole_window );
         data->whole_window = 0;
         wine_tsx11_unlock();
-        return 0;
+        goto done;
     }
 
     set_initial_wm_hints( display, data );
@@ -1493,7 +1502,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
     sync_window_text( display, data->whole_window, text );
 
     /* set the window region */
-    sync_window_region( display, data, (HRGN)1 );
+    if (win_rgn) sync_window_region( display, data, win_rgn );
 
     /* set the window opacity */
     if (!GetLayeredWindowAttributes( data->hwnd, &key, &alpha, &layered_flags )) layered_flags = 0;
@@ -1502,6 +1511,8 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
     wine_tsx11_lock();
     XFlush( display );  /* make sure the window exists before we start painting to it */
     wine_tsx11_unlock();
+done:
+    if (win_rgn) DeleteObject( win_rgn );
     return data->whole_window;
 }
 
-- 
GitLab