Index: src/gui/sdlmain.cpp =================================================================== --- a/src/gui/sdlmain.cpp (revision 4177) +++ b/src/gui/sdlmain.cpp (working copy) @@ -1426,6 +1426,12 @@ #define DB_POLLSKIP 1 #endif +#if defined(LINUX) +#define SDL_XORG_FIX 1 +#else +#define SDL_XORG_FIX 0 +#endif + void GFX_Events() { //Don't poll too often. This can be heavy on the OS, especially Macs. //In idle mode 3000-4000 polls are done per second without this check. @@ -1449,6 +1455,19 @@ } #endif while (SDL_PollEvent(&event)) { +#if SDL_XORG_FIX + // Special code for broken SDL with Xorg 1.20.1, where pairs of inputfocus gain and loss events are generated + // when locking the mouse in windowed mode. + if (event.type == SDL_ACTIVEEVENT && event.active.state == SDL_APPINPUTFOCUS && event.active.gain == 0) { + SDL_Event test; //Check if the next event would undo this one. + if (SDL_PeepEvents(&test,1,SDL_PEEKEVENT,SDL_ACTIVEEVENTMASK) == 1 && test.active.state == SDL_APPINPUTFOCUS && test.active.gain == 1) { + // Skip both events. + SDL_PeepEvents(&test,1,SDL_GETEVENT,SDL_ACTIVEEVENTMASK); + continue; + } + } +#endif + switch (event.type) { case SDL_ACTIVEEVENT: if (event.active.state & SDL_APPINPUTFOCUS) {