read all the available events at once
[dana/dcompmgr.git] / display.c
index be05baf..a03e7ab 100644 (file)
--- a/display.c
+++ b/display.c
@@ -2,6 +2,7 @@
 #include "screen.h"
 #include "gettext.h"
 #include <stdlib.h>
+#include <assert.h>
 #include <string.h>
 #include <stdio.h>
 
@@ -173,6 +174,7 @@ display_open(const char *name)
         dpy = malloc(sizeof(d_display_t));
         dpy->conn = conn;
         dpy->ref = 1;
+        dpy->fd = xcb_get_file_descriptor(conn);
         dpy->screens = NULL;
         dpy->nscreens = 0;
 
@@ -191,7 +193,11 @@ void
 display_unref(d_display_t *dpy)
 {
     if (dpy && --dpy->ref == 0) {
+        int i;
         xcb_disconnect(dpy->conn);
+
+        for (i = 0; i < dpy->nscreens; ++i)
+            screen_free(&dpy->screens[i]);
         free(dpy->screens);
         free(dpy);
     }
@@ -303,8 +309,15 @@ display_screen_from_root(d_display_t *dpy, xcb_window_t root)
 {
     int i;
     for (i = 0; i < dpy->nscreens; ++i)
-        if (dpy->screens[i].super.root == root) return &dpy->screens[i];
-    g_assert_not_reached();
+        if (dpy->screens[i].super.root == root)
+            return &dpy->screens[i];
+    assert(0);
     return NULL;
 }
 
+struct d_screen*
+display_screen_n(d_display_t *dpy, int n)
+{
+    assert(n >= 0 && n < dpy->nscreens);
+    return &dpy->screens[n];
+}