From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/vulkan.c | 12 +++++++++++- dlls/winex11.drv/window.c | 4 ++-- dlls/winex11.drv/x11drv.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index f8987e2c49d..6597771c4c6 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -217,7 +217,17 @@ static void wine_vk_surface_release( struct wine_vk_surface *surface ) }
if (surface->window) - XDestroyWindow(gdi_display, surface->window); + { + struct x11drv_win_data *data; + + if ((data = get_win_data( surface->hwnd ))) + { + detach_client_window( data, surface->window ); + release_win_data( data ); + } + + XDestroyWindow( gdi_display, surface->window ); + }
free(surface); } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 4237e92990e..d38035e2042 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1552,9 +1552,9 @@ Window get_dummy_parent(void) /********************************************************************** * detach_client_window */ -static void detach_client_window( struct x11drv_win_data *data, Window window ) +void detach_client_window( struct x11drv_win_data *data, Window window ) { - if (!data->client_window || data->client_window != window) return; + if (data->client_window != window || !data->client_window) return;
XSelectInput( data->display, data->client_window, 0 ); XFlush( data->display ); /* make sure XSelectInput is disabled for client_window after this point */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 2c15a95dfab..dc14d5ff372 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -657,6 +657,7 @@ extern void update_net_wm_states( struct x11drv_win_data *data ) DECLSPEC_HIDDEN extern void make_window_embedded( struct x11drv_win_data *data ) DECLSPEC_HIDDEN; extern Window create_dummy_client_window(void) DECLSPEC_HIDDEN; extern Window create_client_window( HWND hwnd, const XVisualInfo *visual ) DECLSPEC_HIDDEN; +extern void detach_client_window( struct x11drv_win_data *data, Window window ); extern void set_window_visual( struct x11drv_win_data *data, const XVisualInfo *vis, BOOL use_alpha ) DECLSPEC_HIDDEN; extern void change_systray_owner( Display *display, Window systray_window ) DECLSPEC_HIDDEN; extern HWND create_foreign_window( Display *display, Window window ) DECLSPEC_HIDDEN;