X11: Added a test for a weird X11 error we get with Xinerama, rarely.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c
index b94310f..8250a01 100644
--- a/src/video/x11/SDL_x11modes.c
+++ b/src/video/x11/SDL_x11modes.c
@@ -192,6 +192,21 @@ CheckXinerama(Display * display, int *major, int *minor)
#endif
return SDL_TRUE;
}
+
+/* !!! FIXME: remove this later. */
+/* we have a weird bug where XineramaQueryScreens() throws an X error, so this
+ is here to help track it down (and not crash, too!). */
+static SDL_bool xinerama_triggered_error = SDL_FALSE;
+static int
+X11_XineramaFailed(Display * d, XErrorEvent * e)
+{
+ xinerama_triggered_error = SDL_TRUE;
+ fprintf(stderr, "XINERAMA X ERROR: type=%d serial=%lu err=%u req=%u minor=%u\n",
+ e->type, e->serial, (unsigned int) e->error_code,
+ (unsigned int) e->request_code, (unsigned int) e->minor_code);
+ fflush(stderr);
+ return 0;
+}
#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */
#if SDL_VIDEO_DRIVER_X11_XRANDR
@@ -398,7 +413,15 @@ X11_InitModes(_THIS)
* or newer of the Nvidia binary drivers
*/
if (CheckXinerama(data->display, &xinerama_major, &xinerama_minor)) {
+ int (*handler) (Display *, XErrorEvent *);
+ X11_XSync(data->display, False);
+ handler = X11_XSetErrorHandler(X11_XineramaFailed);
xinerama = X11_XineramaQueryScreens(data->display, &screencount);
+ X11_XSync(data->display, False);
+ X11_XSetErrorHandler(handler);
+ if (xinerama_triggered_error) {
+ xinerama = 0;
+ }
if (xinerama) {
use_xinerama = xinerama_major * 100 + xinerama_minor;
}