X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmain.c;h=ae9bc4ffabb629c9c1746e98925cfb5f5c55b4fe;hb=f8e05a9f3004b5d6cb135512785283e003f0c16e;hp=637183f02bdbd54f17979da017b49b2854fae447;hpb=bb71fd017fc66df3f91bd2ed4366108ae0dc5a4c;p=geometrycompositor.git diff --git a/source/main.c b/source/main.c index 637183f..ae9bc4f 100644 --- a/source/main.c +++ b/source/main.c @@ -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; jnwindows; ++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;