From 6366694d2b12c3227f303f6b2edd6b4efe106bb3 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 10 Feb 2022 14:59:09 +0100 Subject: [PATCH] user32: Destroy window server objects from destroy_thread_windows. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/user32/win.c | 9 +++++++++ server/window.c | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 5e42872ed7a..82975cadd23 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -1216,6 +1216,15 @@ void destroy_thread_windows(void) win->obj.handle = *free_list_ptr; free_list_ptr = (WND **)&win->obj.handle; } + if (free_list) + { + SERVER_START_REQ( destroy_window ) + { + req->handle = 0; /* destroy all thread windows */ + wine_server_call( req ); + } + SERVER_END_REQ; + } USER_Unlock(); while ((win = free_list)) diff --git a/server/window.c b/server/window.c index ec8ee2f1790..6b889df9149 100644 --- a/server/window.c +++ b/server/window.c @@ -2101,8 +2101,13 @@ DECL_HANDLER(set_parent) /* destroy a window */ DECL_HANDLER(destroy_window) { - struct window *win = get_window( req->handle ); - if (win) + struct window *win; + + if (!req->handle) + { + destroy_thread_windows( current ); + } + else if ((win = get_window( req->handle ))) { if (!is_desktop_window(win)) free_window_handle( win ); else if (win->thread == current) detach_window_thread( win );