This is a synchronization point that was missed in a6bc5f34b87393e04ff46659f518f2e7094cc7e4, as XCloseDisplay implies the destruction any every remaining top-level window.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/x11drv_main.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 1b9555bcfbf..25a36cb8c0c 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -721,6 +721,7 @@ void X11DRV_ThreadDetach(void) vulkan_thread_detach(); if (data->xim) XCloseIM( data->xim ); if (data->font_set) XFreeFontSet( data->display, data->font_set ); + XSync( gdi_display, False ); /* make sure XReparentWindow requests have completed before closing the thread display */ XCloseDisplay( data->display ); free( data ); /* clear data in case we get re-entered from user32 before the thread is truly dead */