]> git.sur5r.net Git - i3/i3/commitdiff
Handling Exposure-Events
authorAxel Wagner <mail@merovius.de>
Mon, 26 Jul 2010 21:51:51 +0000 (23:51 +0200)
committerAxel Wagner <mail@merovius.de>
Mon, 26 Jul 2010 21:51:51 +0000 (23:51 +0200)
i3bar/src/main.c
i3bar/src/xcb.c

index fbef9cf0dae551be9ea337dcddfcf55bc52740af..c58dc25e442112cb7430e586aafc70a25f85360d 100644 (file)
@@ -2,7 +2,9 @@
 #include <i3/ipc.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdlib.h>
 #include <ev.h>
+#include <xcb/xcb.h>
 
 #include "ipc.h"
 #include "outputs.h"
 #include "common.h"
 #include "xcb.h"
 
+void ev_prepare_cb(struct ev_loop *loop, ev_prepare *w, int revents) {
+       xcb_flush(xcb_connection);
+}
+
+void ev_check_cb(struct ev_loop *loop, ev_check *w, int revents) {
+       xcb_generic_event_t *event;
+       if ((event = xcb_poll_for_event(xcb_connection)) != NULL) {
+               switch (event->response_type & ~0x80) {
+                       case XCB_EXPOSE:
+                               draw_buttons();
+               }
+               free(event);
+       }
+}
+
+void xcb_io_cb(struct ev_loop *loop, ev_io *w, int revents) {
+}
+
 int main(int argc, char **argv) {
        main_loop = ev_default_loop(0);
 
@@ -18,11 +38,28 @@ int main(int argc, char **argv) {
 
        subscribe_events();
 
+       ev_io *xcb_io = malloc(sizeof(ev_io));
+       ev_prepare *ev_prep = malloc(sizeof(ev_prepare));
+       ev_check *ev_chk = malloc(sizeof(ev_check));
+
+       ev_io_init(xcb_io, &xcb_io_cb, xcb_get_file_descriptor(xcb_connection), EV_READ);
+       ev_prepare_init(ev_prep, &ev_prepare_cb);
+       ev_check_init(ev_chk, &ev_check_cb);
+
+       ev_io_start(main_loop, xcb_io);
+       ev_prepare_start(main_loop, ev_prep);
+       ev_check_start(main_loop, ev_chk);
+
        i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL);
        i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_WORKSPACES, NULL);
 
        ev_loop(main_loop, 0);
 
+       ev_prepare_stop(main_loop, ev_prep);
+       ev_check_stop(main_loop, ev_chk);
+       FREE(ev_prep);
+       FREE(ev_chk);
+
        ev_default_destroy();
        clean_xcb();
        free_outputs();
index fdd7dc15bbde4352ff300e9ac27c96b237d12a21..297469fa705cc067dcdea42931b96b66c3e855a9 100644 (file)
@@ -19,6 +19,10 @@ uint32_t get_colorpixel(const char *s) {
        return (r << 16 | g << 8 | b);
 }
 
+void handle_xcb_event(xcb_generic_event_t ev) {
+
+}
+
 void init_xcb() {
        /* FIXME: xcb_connect leaks Memory */
        xcb_connection = xcb_connect(NULL, NULL);
@@ -77,8 +81,9 @@ void create_windows() {
                printf("Creating Window for output %s\n", walk->name);
 
                walk->bar = xcb_generate_id(xcb_connection);
-               mask = XCB_CW_BACK_PIXEL;
+               mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
                values[0] = xcb_screens->black_pixel;
+               values[1] = XCB_EVENT_MASK_EXPOSURE;
                xcb_create_window(xcb_connection,
                                  xcb_screens->root_depth,
                                  walk->bar,