XSync() is already called when there is a whole window only. When GL child window is deleted shortly after resize X error (request code 12, which is X_ConfigureWindow) may happen. XConfigureWindow is called for child window from sync_client_position. Then, destroy_whole_window() doesn't hit XSync() path because there is no whole_window. client_window is destroyed from opengl.c:release_gl_drawable() independently (that may happen right from X11DRV_DestroyWindow() or later if the drawable is still referenced elsewhere) and that may happen before XConfigureWindow request is processed. We can't flush in release_gl_drawable() as window data is unavailable at that moment and it is unknown which display to flush.
From: Paul Gofman pgofman@codeweavers.com
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/winex11.drv/window.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 3ebbee0856e..1c24cc1d2e3 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1650,6 +1650,8 @@ static void destroy_whole_window( struct x11drv_win_data *data, BOOL already_des } return; } + if (data->client_window && !already_destroyed) + XSync( data->display, False ); } else {