#include "display.h"
#include "screen.h"
+#include "list.h"
#include "gettext.h"
#include <stdlib.h>
#include <assert.h>
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);
}
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);
}
}
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];
-}