From dd7da60a4fae4554d8b0f06fc1258843ac859baa Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 11 Aug 2013 19:56:43 -0700 Subject: [PATCH] Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow() Rainer Deyke I'm running Linux Mint 15 with the Cinnamon window manager. SDL_DestroyWindow consistently locks up for me when the window if fullscreen. --- src/video/x11/SDL_x11window.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index e101bec0c..02529e08a 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -59,6 +59,21 @@ static Bool isConfigureNotify(Display *dpy, XEvent *ev, XPointer win) return ev->type == ConfigureNotify && ev->xconfigure.window == *((Window*)win); } +/* +static Bool +XIfEventTimeout(Display *display, XEvent *event_return, Bool (*predicate)(), XPointer arg, int timeoutMS) +{ + Uint32 start = SDL_GetTicks(); + + while (!XCheckIfEvent(display, event_return, predicate, arg)) { + if ((SDL_GetTicks() - start) >= timeoutMS) { + return False; + } + } + return True; +} +*/ + static SDL_bool X11_IsWindowLegacyFullscreen(_THIS, SDL_Window * window) { @@ -1150,6 +1165,9 @@ X11_BeginWindowFullscreenLegacy(_THIS, SDL_Window * window, SDL_VideoDisplay * _ XReparentWindow(display, data->xwindow, data->fswindow, (rect.w - window->w) / 2, (rect.h - window->h) / 2); + /* Move the mouse to the upper left to make sure it's on-screen */ + XWarpPointer(display, None, root, 0, 0, 0, 0, rect.x, rect.y); + /* Center mouse in the fullscreen window. */ rect.x += (rect.w / 2); rect.y += (rect.h / 2); @@ -1190,8 +1208,9 @@ X11_EndWindowFullscreenLegacy(_THIS, SDL_Window * window, SDL_VideoDisplay * _di XReparentWindow(display, data->xwindow, root, window->x, window->y); /* flush these events so they don't confuse normal event handling */ - XIfEvent(display, &ev, &isUnmapNotify, (XPointer)&data->xwindow); - XIfEvent(display, &ev, &isMapNotify, (XPointer)&data->xwindow); + XSync(display, False); + XCheckIfEvent(display, &ev, &isMapNotify, (XPointer)&data->xwindow); + XCheckIfEvent(display, &ev, &isUnmapNotify, (XPointer)&data->xwindow); SetWindowBordered(display, screen, data->xwindow, (window->flags & SDL_WINDOW_BORDERLESS) == 0);