x11: Wait a bit in SDL_SetWindowSize() to see if window manager vetoed change. Same idea as the fix for Bugzilla #4646. Fixes Bugzilla #4727.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c
index eca7bdf..f1a7948 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