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
- metacity
- KWin
These are great. Now, others are more problematic as you could observe Some of them resize only after:
first hand. Compiz/Unity only falls into the code that does it on select - A user-initiated move or resize
actions, such as window move, raise, map, etc. - A code-initiated move or resize
- Hiding & showing window (Unmap & map)
WindowMaker is even more difficult and will _only_ do it on map. The following move & resize seems to help a lot of WMs that didn't
properly update after the hints were changed. We don't do a
Awesome only does it on user-initiated moves as far as I can tell. hide/show, because there are supposedly subtle problems with doing so
and transitioning from windowed to fullscreen in Unity.
Your raise workaround only fixes compiz/Unity. With that all "modern" */
window managers are covered. Trying to Hide/Show on windowed resize XResizeWindow(display, data->xwindow, window->w, window->h);
(UnMap/Map) fixes both Unity and WindowMaker, but introduces subtle XMoveWindow(display, data->xwindow, window->x, window->y);
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.
*/
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);
} }