SDL: x11: Ensure that a configure event was received before sending the final window size and coordinates

From 09e32faa6827ac9005ce371dca08097e056af1da Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
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 972d98ab0a8ed..fdd0ba3ab01bb 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)