Skip to content

Commit

Permalink
x11: Wait a bit in SDL_SetWindowSize() to see if window manager vetoe…
Browse files Browse the repository at this point in the history
…d change.

Same idea as the fix for Bugzilla #4646.

Fixes Bugzilla #4727.
  • Loading branch information
icculus committed Feb 17, 2020
1 parent e731522 commit 1b82606
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion src/video/x11/SDL_x11window.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1b82606

Please sign in to comment.