Browse Source

Added blank cursor creation error checking on X11.

siavash 12 years ago
parent
commit
3b4eb2f0a0
3 changed files with 30 additions and 12 deletions
  1. 23 11
      src/glx_context.c
  2. 3 1
      src/x11_init.c
  3. 4 0
      src/x11_platform.h

+ 23 - 11
src/glx_context.c

@@ -45,14 +45,32 @@ void (*glXGetProcAddressEXT(const GLubyte* procName))();
 #endif
 
 
-// Error handler used when creating a context
+// Error handler used when creating a context and blank cursor
 //
 static int errorHandler(Display *display, XErrorEvent* event)
 {
-    _glfw.glx.errorCode = event->error_code;
+    char buffer[8192];
+    XGetErrorText(display,
+                  event->error_code,
+                  buffer, sizeof(buffer));
+
+    _glfwInputError(GLFW_PLATFORM_ERROR, "X11 failure: %s", buffer);
+
     return 0;
 }
 
+void _glfwGrabXErrorHandler(void)
+{
+    XSetErrorHandler(errorHandler);
+}
+
+void _glfwReleaseXErrorHandler(void)
+{
+    // Syncing to make sure all commands are processed
+    XSync(_glfw.x11.display, False);
+    XSetErrorHandler(NULL);
+}
+
 // Returns the specified attribute of the specified GLXFBConfig
 // NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig
 //
@@ -428,7 +446,7 @@ int _glfwCreateContext(_GLFWwindow* window,
     }
 
     _glfw.glx.errorCode = Success;
-    XSetErrorHandler(errorHandler);
+    _glfwGrabXErrorHandler();
 
     if (_glfw.glx.ARB_create_context)
     {
@@ -511,18 +529,12 @@ int _glfwCreateContext(_GLFWwindow* window,
     else
         window->glx.context = createLegacyContext(window, native, share);
 
-    XSetErrorHandler(NULL);
+    _glfwReleaseXErrorHandler();
 
     if (window->glx.context == NULL)
     {
-        char buffer[8192];
-        XGetErrorText(_glfw.x11.display,
-                      _glfw.glx.errorCode,
-                      buffer, sizeof(buffer));
-
         _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "GLX: Failed to create context: %s",
-                        buffer);
+                        "GLX: Failed to create context.");
 
         return GL_FALSE;
     }

+ 3 - 1
src/x11_init.c

@@ -553,7 +553,7 @@ static Cursor createNULLCursor(void)
     XColor col;
     Cursor cursor;
 
-    // TODO: Add error checks
+    _glfwGrabXErrorHandler();
 
     cursormask = XCreatePixmap(_glfw.x11.display, _glfw.x11.root, 1, 1, 1);
     xgc.function = GXclear;
@@ -568,6 +568,8 @@ static Cursor createNULLCursor(void)
     XFreePixmap(_glfw.x11.display, cursormask);
     XFreeGC(_glfw.x11.display, gc);
 
+    _glfwReleaseXErrorHandler();
+
     return cursor;
 }
 

+ 4 - 0
src/x11_platform.h

@@ -256,4 +256,8 @@ unsigned long _glfwGetWindowProperty(Window window,
                                      Atom type,
                                      unsigned char** value);
 
+// X11 error handler
+void _glfwGrabXErrorHandler(void);
+void _glfwReleaseXErrorHandler(void);
+
 #endif // _x11_platform_h_