SDL: x11: check if window size/position has changed during SDL_ShowWindow. (49b5c)

From 49b5cfa6c5cb9bb8cecce508e12fa7f8e0cc302f Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Wed, 7 Jun 2023 15:42:22 -0400
Subject: [PATCH] x11: check if window size/position has changed during
 SDL_ShowWindow.

Fixes #4216.
---
 src/video/x11/SDL_x11window.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c
index 914202b3371f..eb7f182b5edb 100644
--- a/src/video/x11/SDL_x11window.c
+++ b/src/video/x11/SDL_x11window.c
@@ -1339,6 +1339,33 @@ void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
             X11_SetKeyboardFocus(new_focus);
         }
     }
+
+    /* Check if the window manager moved us somewhere unexpected, just in case. */
+    {
+        int (*prev_handler)(Display *, XErrorEvent *) = NULL;
+        Window childReturn, root, parent;
+        Window *children;
+        unsigned int childCount;
+        XWindowAttributes attrs;
+        int x, y;
+
+        X11_XSync(display, False);
+        prev_handler = X11_XSetErrorHandler(X11_CatchAnyError);
+        caught_x11_error = SDL_FALSE;
+        X11_XQueryTree(display, data->xwindow, &root, &parent, &children, &childCount);
+        X11_XGetWindowAttributes(display, data->xwindow, &attrs);
+        X11_XTranslateCoordinates(display, parent, DefaultRootWindow(display),
+                                  attrs.x, attrs.y, &x, &y, &childReturn);
+
+        if (!caught_x11_error) {
+            /* if these values haven't changed from our current beliefs, these don't actually generate events. */
+            SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, x, y);
+            SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, attrs.width, attrs.height);
+        }
+
+        X11_XSetErrorHandler(prev_handler);
+        caught_x11_error = SDL_FALSE;
+    }
 }
 
 static void X11_SetWindowActive(SDL_VideoDevice *_this, SDL_Window *window)