X11: Provide specific X error when SDL_GL_CreateContext fails. This makes the X error handler used for GL context creation handle *all* errors and provide the user with specific error messages when SDL_GL_CreateContext fails. CR: icculus@icculus.org
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index 3f0b085..1a56a7e 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -539,24 +539,30 @@ X11_GL_GetVisual(_THIS, Display * display, int screen)
#endif
static int (*handler) (Display *, XErrorEvent *) = NULL;
static int errorBase = 0;
+static int errorCode = 0;
static int
X11_GL_CreateContextErrorHandler(Display * d, XErrorEvent * e)
{
- switch (e->error_code) {
- case BadRequest:
- case BadMatch:
- case BadValue:
- case BadAlloc:
- return (0);
- default:
- if (errorBase &&
- (e->error_code == errorBase + GLXBadContext ||
- e->error_code == errorBase + GLXBadFBConfig ||
- e->error_code == errorBase + GLXBadProfileARB)) {
- return (0);
- }
- return (handler(d, e));
+ char *x11_error = NULL;
+ char x11_error_locale[256];
+
+ errorCode = e->error_code;
+ if (X11_XGetErrorText(d, errorCode, x11_error_locale, sizeof(x11_error_locale)) == Success)
+ {
+ x11_error = SDL_iconv_string("UTF-8", "", x11_error_locale, strlen(x11_error_locale));
+ }
+
+ if (x11_error)
+ {
+ SDL_SetError("Could not create GL context: %s", x11_error);
+ SDL_free(x11_error);
}
+ else
+ {
+ SDL_SetError("Could not create GL context: %i (Base %i)\n", errorCode, errorBase);
+ }
+
+ return (0);
}
SDL_GLContext
@@ -581,6 +587,7 @@ X11_GL_CreateContext(_THIS, SDL_Window * window)
/* We do this to create a clean separation between X and GLX errors. */
X11_XSync(display, False);
errorBase = _this->gl_data->errorBase;
+ errorCode = Success;
handler = X11_XSetErrorHandler(X11_GL_CreateContextErrorHandler);
X11_XGetWindowAttributes(display, data->xwindow, &xattr);
v.screen = screen;
@@ -675,7 +682,9 @@ X11_GL_CreateContext(_THIS, SDL_Window * window)
X11_XSetErrorHandler(handler);
if (!context) {
- SDL_SetError("Could not create GL context");
+ if (errorCode == Success) {
+ SDL_SetError("Could not create GL context");
+ }
return NULL;
}