From f001a00b081e864fd2e7eef1e6f7313b9db916e5 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 29 May 2015 15:21:47 -0400 Subject: [PATCH] X11: Force the window focus during ShowWindow if there's no window manager. Fixes Bugzilla #2997. --- src/video/x11/SDL_x11window.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 8ce979d51..245050e95 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -884,6 +884,24 @@ X11_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) X11_XCheckIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow); } +static SDL_bool +X11_HasWindowManager(const SDL_WindowData *data) +{ + const SDL_DisplayData *displaydata = + (SDL_DisplayData *) SDL_GetDisplayForWindow(data->window)->driverdata; + Display *display = data->videodata->display; + const int screen = displaydata->screen; + char atomname[16]; + Atom atom; + + /* Compliments to Chromium for this technique. + Window Managers are supposed to own "WM_Sx" selections, where + "x" is the screen number (ICCCM 2.8). */ + SDL_snprintf(atomname, sizeof (atomname), "WM_S%d", screen); + atom = X11_XInternAtom(display, atomname, True); + return ((atom != None) && (X11_XGetSelectionOwner(display, atom) != None)); +} + void X11_ShowWindow(_THIS, SDL_Window * window) { @@ -899,6 +917,12 @@ X11_ShowWindow(_THIS, SDL_Window * window) X11_XIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow); X11_XFlush(display); } + + if (!X11_HasWindowManager(data)) { + /* no WM means no FocusIn event, which confuses us. Force it. */ + X11_XSetInputFocus(display, data->xwindow, RevertToNone, CurrentTime); + X11_XFlush(display); + } } void