Fix SDL_SetWindowSize on certain WMs.

Makes SDL_SetWindowSize work on some WMs (like Fluxbox, ion3, Awesome,
WindowMaker), and when running without a WM.

Fixes bug 1513.
CR: saml
This commit is contained in:
Jørgen P. Tjernø 2013-02-18 18:28:02 -08:00
parent 72ec6bcbe2
commit 6e147b2087
4 changed files with 16 additions and 25 deletions

View file

@ -768,37 +768,28 @@ X11_SetWindowSize(_THIS, SDL_Window * window)
XFree(sizehints); XFree(sizehints);
/* From Pierre-Loup: /* From Pierre-Loup:
For the windowed resize problem; WMs each have their little quirks with WMs each have their little quirks with that. When you change the
that. When you change the size hints, they get a ConfigureNotify event size hints, they get a ConfigureNotify event with the
with the WM_NORMAL_SIZE_HINTS Atom. They all save the hints then, but WM_NORMAL_SIZE_HINTS Atom. They all save the hints then, but they
they don't all resize the window right away to enforce the new hints. don't all resize the window right away to enforce the new hints.
Those who do properly do it are:
- XFWM Some of them resize only after:
- metacity - A user-initiated move or resize
- KWin - A code-initiated move or resize
- Hiding & showing window (Unmap & map)
These are great. Now, others are more problematic as you could observe The following move & resize seems to help a lot of WMs that didn't
first hand. Compiz/Unity only falls into the code that does it on select properly update after the hints were changed. We don't do a
actions, such as window move, raise, map, etc. hide/show, because there are supposedly subtle problems with doing so
and transitioning from windowed to fullscreen in Unity.
WindowMaker is even more difficult and will _only_ do it on map.
Awesome only does it on user-initiated moves as far as I can tell.
Your raise workaround only fixes compiz/Unity. With that all "modern"
window managers are covered. Trying to Hide/Show on windowed resize
(UnMap/Map) fixes both Unity and WindowMaker, but introduces subtle
problems with transitioning from Windowed to Fullscreen on Unity. Since
some window moves happen after the transitions to fullscreen, that forces
SDL to fall from windowed to fullscreen repeatedly and it sometimes leaves
itself in a state where the fullscreen window is slightly offset by what
used to be the window decoration titlebar.
*/ */
XResizeWindow(display, data->xwindow, window->w, window->h);
XMoveWindow(display, data->xwindow, window->x, window->y);
XRaiseWindow(display, data->xwindow); XRaiseWindow(display, data->xwindow);
} else { } else {
XResizeWindow(display, data->xwindow, window->w, window->h); XResizeWindow(display, data->xwindow, window->w, window->h);
} }
XFlush(display); XFlush(display);
} }