Skip to content

Commit

Permalink
X11: Added a test for a weird X11 error we get with Xinerama, rarely.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Jun 30, 2015
1 parent 20ec137 commit 1e3c28a
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/video/x11/SDL_x11modes.c
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 1e3c28a

Please sign in to comment.