]> git.tdb.fi Git - geometrycompositor.git/blobdiff - source/main.c
Remove server grabbing code
[geometrycompositor.git] / source / main.c
index 35328543cbbb4cfc80329c8a531870ab6690aaa0..561159d5be08ebf6802a102049846b0f470d138f 100644 (file)
@@ -16,6 +16,7 @@ typedef struct CompositedWindow
        int y;
        unsigned width;
        unsigned height;
+       unsigned border;
        int map_state;
        Damage damage;
        Pixmap pixmap;
@@ -42,6 +43,7 @@ typedef struct CompositedScreen
        CompositedWindow *windows;
        unsigned nwindows;
        unsigned windows_capacity;
+       int dirty;
 } CompositedScreen;
 
 typedef struct Compositor
@@ -53,6 +55,7 @@ typedef struct Compositor
        PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB;
        PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT;
        PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT;
+       int dirty;
 } Compositor;
 
 static const char *vshader =
@@ -275,6 +278,7 @@ void add_window(Compositor *compositor, CompositedScreen *screen, Window w)
        window->y = win_attr.y;
        window->width = win_attr.width;
        window->height = win_attr.height;
+       window->border = win_attr.border_width;
        window->map_state = win_attr.map_state;
 
        window->damage = XDamageCreate(compositor->display, window->window, XDamageReportNonEmpty);
@@ -303,6 +307,18 @@ CompositedScreen *find_screen_by_root(Compositor *compositor, Window root)
        return NULL;
 }
 
+CompositedScreen *find_screen_by_window(Compositor *compositor, Window w)
+{
+       unsigned i, j;
+
+       for(i=0; i<compositor->nscreens; ++i)
+               for(j=0; j<compositor->screens[i].nwindows; ++j)
+                       if(compositor->screens[i].windows[j].window==w)
+                               return &compositor->screens[i];
+
+       return NULL;
+}
+
 int initialize_screen(Compositor *compositor, unsigned number)
 {
        CompositedScreen *screen;
@@ -456,10 +472,27 @@ void process_unmap_event(Compositor *compositor, XUnmapEvent *event)
                window->map_state = IsUnviewable;
 }
 
-void process_event(Compositor *compositor)
+void process_damage_event(Compositor *compositor, XDamageNotifyEvent *event)
+{
+       CompositedScreen *screen = find_screen_by_window(compositor, event->drawable);
+       if(!screen)
+               return;
+
+       screen->dirty = 1;
+       compositor->dirty = 1;
+}
+
+int process_event(Compositor *compositor)
 {
        XEvent event;
-       XNextEvent(compositor->display, &event);
+       if(compositor->dirty)
+       {
+               if(!XCheckMaskEvent(compositor->display, -1, &event))
+                       return 0;
+       }
+       else
+               XNextEvent(compositor->display, &event);
+
        switch(event.type)
        {
        case CreateNotify:
@@ -472,9 +505,13 @@ void process_event(Compositor *compositor)
                process_unmap_event(compositor, &event.xunmap);
                break;
        default:
-               if(event.type!=compositor->damage_event+XDamageNotify)
+               if(event.type==compositor->damage_event+XDamageNotify)
+                       process_damage_event(compositor, (XDamageNotifyEvent *)&event);
+               else
                        printf("Event %d\n", event.type);
        }
+
+       return 1;
 }
 
 void refresh_screens(Compositor *compositor)
@@ -491,8 +528,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];
@@ -500,15 +535,18 @@ void refresh_screens(Compositor *compositor)
                        {
                                glBindTexture(GL_TEXTURE_2D, window->texture);
                                compositor->glXBindTexImageEXT(compositor->display, window->glx_pixmap, GLX_FRONT_LEFT_EXT, NULL);
-                               glUniform4f(screen->geometry_loc, (float)window->x/screen->width, (float)(screen->height-window->y-window->height)/screen->height, (float)window->width/screen->width, (float)window->height/screen->height);
+                               glUniform4f(screen->geometry_loc, (float)window->x/screen->width, (float)(screen->height-window->y-window->height)/screen->height, (float)(window->width+2*window->border)/screen->width, (float)(window->height+2*window->border)/screen->height);
                                glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
                                compositor->glXReleaseTexImageEXT(compositor->display, window->glx_pixmap, GLX_FRONT_LEFT_EXT);
                                XDamageSubtract(compositor->display, window->damage, None, None);
                        }
                }
-               XUngrabServer(compositor->display);
                glXSwapBuffers(compositor->display, screen->glx_window);
+
+               screen->dirty = 0;
        }
+
+       compositor->dirty = 0;
 }
 
 int main()
@@ -520,8 +558,8 @@ int main()
 
        while(1)
        {
-               process_event(&compositor);
-               refresh_screens(&compositor);
+               if(!process_event(&compositor))
+                       refresh_screens(&compositor);
        }
 
        shutdown_compositor(&compositor);