From aa536217b3e1a9ea4a5de9944cadbd79b134a41a Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 7 Jun 2023 15:42:22 -0400 Subject: [PATCH] x11: check if window size/position has changed during SDL_ShowWindow. Fixes #4216. (cherry picked from commit 49b5cfa6c5cb9bb8cecce508e12fa7f8e0cc302f) --- 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 dd93514ff..c3ddc5efc 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -1180,6 +1180,33 @@ void X11_ShowWindow(_THIS, SDL_Window *window) if (data->border_left == 0 && data->border_right == 0 && data->border_top == 0 && data->border_bottom == 0) { X11_GetBorderValues(data); } + + /* 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_WINDOWEVENT_MOVED, x, y); + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, attrs.width, attrs.height); + } + + X11_XSetErrorHandler(prev_handler); + caught_x11_error = SDL_FALSE; + } } void X11_HideWindow(_THIS, SDL_Window *window)