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)