]> git.tdb.fi Git - geometrycompositor.git/blobdiff - source/main.c
Ignore errors from the X server
[geometrycompositor.git] / source / main.c
index 637183f02bdbd54f17979da017b49b2854fae447..ae9bc4ffabb629c9c1746e98925cfb5f5c55b4fe 100644 (file)
@@ -87,6 +87,13 @@ static const float vertices[] =
        1.0f, 0.0f
 };
 
+int x_error_handler(Display *display, XErrorEvent *event)
+{
+       printf("Ignoring X error %d on resource %lx\n", event->error_code, event->resourceid);
+       (void)display;
+       return 0;
+}
+
 int with_error(const char *message)
 {
        fprintf(stderr, "%s\n", message);
@@ -258,7 +265,11 @@ void add_window(Compositor *compositor, CompositedScreen *screen, Window w)
        if(w==screen->root || w==screen->overlay)
                return;
 
-       XGetWindowAttributes(compositor->display, w, &win_attr);
+       if(!XGetWindowAttributes(compositor->display, w, &win_attr))
+       {
+               printf("XGetWindowAttributes failed; probably the window was already destroyed\n");
+               return;
+       }
        if(win_attr.class==InputOnly)
                return;
 
@@ -379,6 +390,8 @@ int initialize_compositor(Compositor *compositor)
        if(!compositor->display)
                return with_error("Could not open X display");
 
+       XSetErrorHandler(&x_error_handler);
+
        if(!XCompositeQueryExtension(compositor->display, &event_base, &error_base))
                return with_error("XComposite is required but was not found");
        else if(!XCompositeQueryVersion(compositor->display, &major_ver, &minor_ver))
@@ -528,8 +541,6 @@ void refresh_screens(Compositor *compositor)
 
                glUseProgram(screen->program);
                glBindVertexArray(screen->vertex_array);
-               XGrabServer(compositor->display);
-               glXWaitX();
                for(j=0; j<screen->nwindows; ++j)
                {
                        CompositedWindow *window = &screen->windows[j];
@@ -543,7 +554,6 @@ void refresh_screens(Compositor *compositor)
                                XDamageSubtract(compositor->display, window->damage, None, None);
                        }
                }
-               XUngrabServer(compositor->display);
                glXSwapBuffers(compositor->display, screen->glx_window);
 
                screen->dirty = 0;