Skip to content

Commit

Permalink
X11: Force the window focus during ShowWindow if there's no window ma…
Browse files Browse the repository at this point in the history
…nager.

Fixes Bugzilla #2997.
  • Loading branch information
icculus committed May 29, 2015
1 parent c888183 commit f001a00
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/video/x11/SDL_x11window.c
Expand Up @@ -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)
{
Expand All @@ -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
Expand Down

0 comments on commit f001a00

Please sign in to comment.