#include "screen.h"
+#include "window.h"
#include "gettext.h"
#include <glib.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <xcb/xcb.h>
count = i = 0;
for (it = xcb_setup_roots_iterator(setup); it.rem; xcb_screen_next(&it)) {
sc.super = *it.data;
+ sc.conn = conn;
sc.num = i++;
- if (screen_register(conn, &sc)) {
+ if (screen_register(&sc)) {
++count;
*list = g_renew(d_screen_t, *list, count);
(*list)[count-1] = sc;
return count;
}
+d_screen_t*
+screen_from_root(d_screen_t *list, int n, xcb_window_t root)
+{
+ int i;
+ for (i = 0; i < n; ++i)
+ if (list->super.root == root) return &list[i];
+ g_assert_not_reached();
+ return NULL;
+}
+
int
main(int argc, char **argv)
{
- xcb_connection_t *conn;
- d_screen_t *screens = NULL;
+ xcb_connection_t *conn;
+ d_screen_t *screens = NULL;
+ int nscreens;
+ xcb_generic_event_t *ev;
conn = xcb_connect(NULL, NULL);
if (!conn) {
return 1;
}
- all_screens(conn, &screens);
-
+ nscreens = all_screens(conn, &screens);
+ if (nscreens < 1) {
+ printf(_("found no screens to run on\n"));
+ xcb_disconnect(conn);
+ return 0;
+ }
+
+ while ((ev = xcb_wait_for_event(conn))) {
+ printf("event %d\n", ev->response_type);
+
+ if (!ev->response_type) {
+ error(conn, (xcb_generic_error_t*)ev);
+ free(ev);
+ continue;
+ }
+
+ switch (ev->response_type) {
+ case XCB_CREATE_NOTIFY:
+ {
+ xcb_create_notify_event_t *cev;
+ d_screen_t *sc;
+
+ cev = (xcb_create_notify_event_t*)ev;
+ sc = screen_from_root(screens, nscreens, cev->parent);
+ if (!sc) break;
+ screen_add_window(sc, cev->window);
+ break;
+ }
+ case XCB_DESTROY_NOTIFY:
+ {
+ xcb_destroy_notify_event_t *dev;
+ d_screen_t *sc;
+ d_window_t *w;
+
+ dev = (xcb_destroy_notify_event_t*)ev;
+ sc = screen_from_root(screens, nscreens, dev->event);
+ if (!sc) break;
+ w = screen_find_window(sc, dev->window);
+ w->hide(w);
+ screen_remove_window(sc, w);
+ break;
+ }
+ case XCB_REPARENT_NOTIFY:
+ {
+ xcb_reparent_notify_event_t *rev;
+ d_screen_t *sc;
+ d_window_t *w;
+
+ rev = (xcb_reparent_notify_event_t*)ev;
+ sc = screen_from_root(screens, nscreens, rev->event);
+ if (!sc) break;
+ w = screen_find_window(sc, rev->window);
+ if (rev->parent == sc->super.root)
+ screen_add_window(sc, rev->window);
+ else {
+ w->hide(w);
+ screen_remove_window(sc, w);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ free(ev);
+ }
xcb_disconnect(conn);
return 0;