From 09e32faa6827ac9005ce371dca08097e056af1da Mon Sep 17 00:00:00 2001 From: Frank Praznik Date: Thu, 18 Apr 2024 13:59:41 -0400 Subject: [PATCH] x11: Ensure that a configure event was received before sending the final window size and coordinates Headless display servers might not send an initial configure event, so don't assume that one has arrived and send garbage size/position values when showing a window. --- src/video/x11/SDL_x11window.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 972d98ab0..fdd0ba3ab 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -1369,18 +1369,23 @@ void X11_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) X11_XSync(display, False); X11_PumpEvents(_this); - int x = data->last_xconfigure.x; - int y = data->last_xconfigure.y; - SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); + /* If a configure event was received (type is non-zero), send the final window size and coordinates. */ + if (data->last_xconfigure.type) { + int x = data->last_xconfigure.x; + int y = data->last_xconfigure.y; + SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); - /* If the borders appeared, this happened automatically in the event system, otherwise, set the position now. */ - if (data->disable_size_position_events && (window->x != x || window->y != y)) { - data->pending_operation = X11_PENDING_OP_MOVE; - X11_XMoveWindow(display, data->xwindow, window->x, window->y); + /* If the borders appeared, this happened automatically in the event system, otherwise, set the position now. */ + if (data->disable_size_position_events && (window->x != x || window->y != y)) { + data->pending_operation = X11_PENDING_OP_MOVE; + X11_XMoveWindow(display, data->xwindow, window->x, window->y); + } + + SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, data->last_xconfigure.width, data->last_xconfigure.height); + SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, x, y); } + data->disable_size_position_events = SDL_FALSE; - SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, data->last_xconfigure.width, data->last_xconfigure.height); - SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, x, y); } void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)