From c0255be458e23b6a8d34023035213415cb26da45 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 26 Oct 2019 23:58:55 -0400 Subject: [PATCH] x11: check if the X server honored our XMoveWindow() call (thanks, R.E. Rust!). This can happen if a window is still grabbed when we try to move it, or if the X11 ecosystem is just in a bad mood, I guess. This makes sure that SDL will report the correct position for a window; otherwise, SDL_GetWindowPosition will just report whatever the last SDL_SetWindowPosition call requested, even if the window didn't actually move. Fixes Bugzilla #4646. --- src/video/x11/SDL_x11window.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index c5bb1dc95..8dbe8d82c 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -805,9 +805,24 @@ X11_SetWindowPosition(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; Display *display = data->videodata->display; + unsigned int childCount; + Window childReturn, root, parent; + Window* children; + XWindowAttributes attrs; + /*Attempt to move the window*/ X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); X11_XFlush(display); + + /*If the window is not moved, then the coordinates on the window structure are out of sync, so we + update them here. */ + 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, + &window->x, &window->y, + &childReturn); } void