diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 914202b33..eb7f182b5 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)