#include "screen.h"
#include "gettext.h"
#include <stdlib.h>
+#include <assert.h>
#include <string.h>
#include <stdio.h>
{
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];
+}
int display_claim_screens(d_display_t *dpy);
struct d_screen* display_screen_from_root(d_display_t *dpy, xcb_window_t root);
+struct d_screen* display_screen_n(d_display_t *dpy, int n);
void display_error(d_display_t *dpy, xcb_generic_error_t *ev);
static gboolean screen_init(d_screen_t *sc);
static xcb_timestamp_t screen_timestamp(d_screen_t *sc);
+static void screen_add_existing_windows(d_screen_t *sc);
gboolean
screen_register(struct d_display *dpy, int num, d_screen_t *sc)
sck = xcb_get_selection_owner(sc->dpy->conn, arep->atom);
srep = xcb_get_selection_owner_reply(sc->dpy->conn, sck, NULL);
taken = srep->owner == w;
- if (taken && screen_init(sc))
+ if (taken && screen_init(sc)) {
+ screen_add_existing_windows(sc);
ret = TRUE;
+ }
else {
xcb_destroy_window(sc->dpy->conn, w);
ret = FALSE;
printf("screen added window 0x%x\n", w->id);
}
+static void
+screen_add_existing_windows(d_screen_t *sc)
+{
+ xcb_query_tree_cookie_t ck;
+ xcb_query_tree_reply_t *rep;
+
+ ck = xcb_query_tree(sc->dpy->conn, sc->super.root);
+ rep = xcb_query_tree_reply(sc->dpy->conn, ck, NULL);
+ if (rep) {
+ xcb_window_iterator_t it;
+
+ printf("query\n");
+ it = xcb_query_tree_children_iterator(rep);
+ for (; it.rem; xcb_window_next(&it))
+ screen_add_window(sc, *it.data);
+
+ free(rep);
+ }
+}
+
void
screen_remove_window(d_screen_t *sc, struct d_window *w)
{