use the list for holding all the managed screens in the display. limit the number...
[dana/dcompmgr.git] / display.c
index a03e7ab..ef2ba70 100644 (file)
--- a/display.c
+++ b/display.c
@@ -1,5 +1,6 @@
 #include "display.h"
 #include "screen.h"
+#include "list.h"
 #include "gettext.h"
 #include <stdlib.h>
 #include <assert.h>
@@ -175,8 +176,7 @@ display_open(const char *name)
         dpy->conn = conn;
         dpy->ref = 1;
         dpy->fd = xcb_get_file_descriptor(conn);
-        dpy->screens = NULL;
-        dpy->nscreens = 0;
+        dpy->screens = list_new();
 
         query_statics(dpy);
     }
@@ -193,12 +193,13 @@ void
 display_unref(d_display_t *dpy)
 {
     if (dpy && --dpy->ref == 0) {
-        int i;
+        d_list_it_t *it;
+
         xcb_disconnect(dpy->conn);
 
-        for (i = 0; i < dpy->nscreens; ++i)
-            screen_free(&dpy->screens[i]);
-        free(dpy->screens);
+        for (it = list_top(dpy->screens); it; it = it->next)
+            screen_unref(it->data);
+        list_unref(dpy->screens);
         free(dpy);
     }
 }
@@ -284,40 +285,33 @@ display_claim_screens(d_display_t *dpy)
     static const xcb_setup_t *setup;
     xcb_screen_iterator_t it;
     int i;
-    d_screen_t sc;
+    d_screen_t *sc;
 
     setup = xcb_get_setup(dpy->conn);
 
     i = 0;
     for (it = xcb_setup_roots_iterator(setup); it.rem; xcb_screen_next(&it)) {
-        sc.super = *it.data;
-        sc.dpy = dpy;
-        sc.num = i++;
-        if (screen_register(dpy, i, &sc)) {
-            ++dpy->nscreens;
-            dpy->screens = realloc(dpy->screens,
-                                   sizeof(d_screen_t)*dpy->nscreens);
-            dpy->screens[dpy->nscreens-1] = sc;
-            printf(_("managing screen %d\n"), sc.num);
+        sc = screen_new(dpy, i++, it.data);
+        if (screen_register(sc)) {
+            list_append(dpy->screens, sc);
+            printf(_("managing screen %d\n"), sc->num);
         }
+        else
+            screen_unref(sc);
     }
-    return dpy->nscreens;
+    return list_length(dpy->screens);
 }
 
 d_screen_t*
 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];
+    d_list_it_t *it;
+
+    for (it = list_top(dpy->screens); it; it = it->next) {
+        d_screen_t *sc = it->data;
+        if (sc->super.root == root)
+            return sc;
+    }
     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];
-}