Skip to content

Commit

Permalink
x11: SDL_SetWindowPosition should try to wait for the window manager.
Browse files Browse the repository at this point in the history
Wait up to 100 milliseconds, since the window manager might alter or
outright veto the window change...or not respond at all.

In a well-functioning system, though, this should help make sure
that SDL_SetWindowPosition's results match reality.

Fixes Bugzilla #4646.
  • Loading branch information
icculus committed Feb 14, 2020
1 parent a77a890 commit d1df343
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions src/video/x11/SDL_x11window.c
Expand Up @@ -809,20 +809,36 @@ X11_SetWindowPosition(_THIS, SDL_Window * window)
Window childReturn, root, parent;
Window* children;
XWindowAttributes attrs;
int orig_x, orig_y;
Uint32 timeout;

/*Attempt to move the window*/
X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top);
X11_XSync(display, False);

/*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);
X11_XTranslateCoordinates(display, parent, DefaultRootWindow(display),
attrs.x, attrs.y, &orig_x, &orig_y, &childReturn);

/*Attempt to move the window*/
X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top);

/* Wait a brief time to see if the window manager decided to let this move happen.
If the window changes at all, even to an unexpected value, we break out. */
timeout = SDL_GetTicks() + 100;
do {
int x, y;
X11_XSync(display, False);
X11_XGetWindowAttributes(display, data->xwindow, &attrs);
X11_XTranslateCoordinates(display, parent, DefaultRootWindow(display),
attrs.x, attrs.y, &x, &y, &childReturn);

if ((x != orig_x) || (y != orig_y)) {
window->x = x;
window->y = y;
break; /* window moved, time to go. */
}

SDL_Delay(10);
} while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout));
}

void
Expand Down

0 comments on commit d1df343

Please sign in to comment.