glazier

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit c45f489a8481df47c9d7848f17b54217f42ae4f0
parent c63c7d4a8844213d6fc6a355979377257c25389f
Author: Willy <willyatmailoodotorg>
Date:   Fri Aug 12 02:06:31 +0200

Implement callbacks mechanism

Diffstat:
README | 3+--
config.mk | 2+-
glazier.c | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/README b/README @@ -5,4 +5,4 @@ glazier > removing glass -- wikipedia -In other words, a glazier manipulates windows.- \ No newline at end of file +In other words, a glazier manipulates windows. diff --git a/config.mk b/config.mk @@ -7,6 +7,6 @@ PREFIX = /usr/local MANDIR = ${PREFIX}/man CPPFLAGS = -I./libwm -DVERSION=\"${VERSION}\" -CFLAGS = ${CPPFLAGS} -Wall -Wextra -pedantic +CFLAGS = ${CPPFLAGS} -Wall -Wextra -pedantic -g LDFLAGS = LIBS = -lxcb diff --git a/glazier.c b/glazier.c @@ -1,12 +1,72 @@ +#include <stdio.h> #include <xcb/xcb.h> #include "wm.h" +#define LEN(x) (sizeof(x)/sizeof(x[0])) + +struct ev_callback_t { + uint32_t type; + int (*handle)(xcb_generic_event_t *); +}; + +static int cb_create(xcb_generic_event_t *); +static int ev_callback(xcb_generic_event_t *); +static void ev_loop(); + xcb_connection_t *conn; xcb_screen_t *scrn; +static const struct ev_callback_t cb[] = { + /* event, function */ + { XCB_CREATE_NOTIFY, cb_create }, +}; + +static int +cb_create(xcb_generic_event_t *ev) +{ + xcb_create_notify_event_t *e = (xcb_create_notify_event_t *)ev; + + printf("%d:%d\n", e->response_type, e->window); + return 0; +} + +static int +ev_callback(xcb_generic_event_t *ev) +{ + uint8_t i; + uint32_t type; + + type = ev->response_type & ~0x80; + for (i=0; i<LEN(cb); i++) + if (type == cb->type) + return cb->handle(ev); + + return 1; +} + +static void +ev_loop() +{ + xcb_generic_event_t *ev = NULL; + + /* needed to get notified of windows creation */ + wm_reg_event(scrn->root, XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY); + xcb_flush(conn); + + for (;;) { + ev = xcb_wait_for_event(conn); + ev_callback(ev); + } +} + int main (int argc, char *argv[]) { + wm_init_xcb(); + wm_get_screen(); + ev_loop(); + wm_kill_xcb(); + return 0; } \ No newline at end of file