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.
--HG--
extra : rebase_source : 4dd57085a593f68553f921ba574607c01e8c08b9
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 @@
{
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_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