]> git.cworth.org Git - apitrace/commitdiff
Handle gracefully errors when trying to read glXCreatewindow drawables.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 19 Jun 2011 11:34:33 +0000 (12:34 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 19 Jun 2011 11:34:33 +0000 (12:34 +0100)
glsnapshot.cpp

index 98a11fb1d5d78b55b9505286c6b0030f03861f34..6385fcc140c12ba31fe29fb82a7423c642ae251d 100644 (file)
 #include "glsize.hpp"
 
 
+#if !defined(_WIN32) && !defined(__APPLE__)
+
+
+#include <X11/Xproto.h>
+
+
+static int
+errorHandler(Display *display, XErrorEvent *event)
+{
+    if (event->error_code == BadDrawable &&
+        event->request_code == X_GetGeometry) {
+        return 0;
+    }
+
+    char error_text[512];
+    XGetErrorText(display, event->error_code, error_text, sizeof error_text);
+    fprintf(stderr, "X Error of failed request:  %s\n", error_text);
+
+    return 0;
+}
+
+
+#endif /* !_WIN32 && !__APPLE__ */
+
+
 namespace glsnapshot {
 
 
@@ -91,7 +116,13 @@ getDrawableImage(void) {
      * XXX: This does not work for drawables created with glXCreateWindow
      */
 
-    if (!XGetGeometry(display, drawable, &root, &x, &y, &w, &h, &bw, &depth)) {
+    int (*oldErrorHandler)(Display *, XErrorEvent *);
+    Status status;
+
+    oldErrorHandler = XSetErrorHandler(errorHandler);
+    status = XGetGeometry(display, drawable, &root, &x, &y, &w, &h, &bw, &depth);
+    XSetErrorHandler(oldErrorHandler);
+    if (!status) {
         return false;
     }