diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index eca7bdf1c..f1a79483c 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -910,6 +910,14 @@ X11_SetWindowSize(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; Display *display = data->videodata->display; + XWindowAttributes attrs; + int orig_w, orig_h; + Uint32 timeout; + + X11_XSync(display, False); + X11_XGetWindowAttributes(display, data->xwindow, &attrs); + orig_w = attrs.width; + orig_h = attrs.height; if (SDL_IsShapedWindow(window)) { X11_ResizeWindowShape(window); @@ -953,7 +961,27 @@ X11_SetWindowSize(_THIS, SDL_Window * window) X11_XResizeWindow(display, data->xwindow, window->w, window->h); } - X11_XFlush(display); + /* Wait a brief time to see if the window manager decided to let this resize happen. + If the window changes at all, even to an unexpected value, we break out. */ + timeout = SDL_GetTicks() + 100; + while (SDL_TRUE) { + X11_XSync(display, False); + X11_XGetWindowAttributes(display, data->xwindow, &attrs); + + if ((attrs.width != orig_w) || (attrs.height != orig_h)) { + window->w = attrs.width; + window->h = attrs.height; + break; /* window changed, time to go. */ + } else if ((attrs.width == window->w) && (attrs.height == window->h)) { + break; /* we're at the place we wanted to be anyhow, drop out. */ + } + + if (SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + break; + } + + SDL_Delay(10); + } } int