X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=obt%2Fmainloop.c;h=ecdd7f7f535fdfafeb265884dbb79cf5ca32dbfb;hb=0d90bd57abe304ffca4bf5cd1a647d30dea882b7;hp=9797770d9f3e19528a2c29026b3cd7fececf565f;hpb=452627a51ce38229533dfe5d8eeb877b0918d02c;p=chaz%2Fopenbox diff --git a/obt/mainloop.c b/obt/mainloop.c index 9797770d..ecdd7f7f 100644 --- a/obt/mainloop.c +++ b/obt/mainloop.c @@ -18,12 +18,24 @@ */ #include "obt/mainloop.h" +#include "obt/display.h" #include "obt/util.h" +#ifdef HAVE_STDIO_H #include +#endif +#ifdef HAVE_STDLIB_H #include +#endif +#ifdef HAVE_SYS_SELECT_H #include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SIGNAL_H #include +#endif typedef struct _ObtMainLoopTimer ObtMainLoopTimer; typedef struct _ObtMainLoopSignal ObtMainLoopSignal; @@ -67,6 +79,7 @@ static gint core_signals[] = static void sighandler(gint sig); static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait); static void fd_handler_destroy(gpointer data); +static void calc_max_fd(ObtMainLoop *loop); struct _ObtMainLoop { @@ -138,17 +151,15 @@ struct _ObtMainLoopFdHandlerType GDestroyNotify destroy; }; -ObtMainLoop *obt_main_loop_new(Display *display) +ObtMainLoop *obt_main_loop_new(void) { ObtMainLoop *loop; - loop = g_new0(ObtMainLoop, 1); + loop = g_slice_new0(ObtMainLoop); loop->ref = 1; - loop->display = display; - loop->fd_x = ConnectionNumber(display); FD_ZERO(&loop->fd_set); - FD_SET(loop->fd_x, &loop->fd_set); - loop->fd_max = loop->fd_x; + loop->fd_x = -1; + loop->fd_max = -1; loop->fd_handlers = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, fd_handler_destroy); @@ -212,7 +223,7 @@ void obt_main_loop_unref(ObtMainLoop *loop) for (it = loop->timers; it; it = g_slist_next(it)) { ObtMainLoopTimer *t = it->data; if (t->destroy) t->destroy(t->data); - g_free(t); + g_slice_free(ObtMainLoopTimer, t); } g_slist_free(loop->timers); loop->timers = NULL; @@ -238,7 +249,7 @@ void obt_main_loop_unref(ObtMainLoop *loop) } } - obt_free0(loop, ObtMainLoop, 1); + g_slice_free(ObtMainLoop, loop); } } @@ -289,6 +300,9 @@ void obt_main_loop_run(ObtMainLoop *loop) do { XNextEvent(loop->display, &e); + if (e.type == MappingNotify) + XRefreshKeyboardMapping(&e.xmapping); + for (it = loop->x_handlers; it; it = g_slist_next(it)) { ObtMainLoopXHandlerType *h = it->data; h->func(&e, h->data); @@ -334,16 +348,26 @@ void obt_main_loop_x_add(ObtMainLoop *loop, { ObtMainLoopXHandlerType *h; - h = g_new(ObtMainLoopXHandlerType, 1); + h = g_slice_new(ObtMainLoopXHandlerType); h->loop = loop; h->func = handler; h->data = data; h->destroy = notify; + + if (!loop->x_handlers) { + g_assert(obt_display); /* is the display open? */ + + loop->display = obt_display; + loop->fd_x = ConnectionNumber(loop->display); + FD_SET(loop->fd_x, &loop->fd_set); + calc_max_fd(loop); + } + loop->x_handlers = g_slist_prepend(loop->x_handlers, h); } void obt_main_loop_x_remove(ObtMainLoop *loop, - ObtMainLoopXHandler handler) + ObtMainLoopXHandler handler) { GSList *it, *next; @@ -353,9 +377,14 @@ void obt_main_loop_x_remove(ObtMainLoop *loop, if (h->func == handler) { loop->x_handlers = g_slist_delete_link(loop->x_handlers, it); if (h->destroy) h->destroy(h->data); - g_free(h); + g_slice_free(ObtMainLoopXHandlerType, h); } } + + if (!loop->x_handlers) { + FD_CLR(loop->fd_x, &loop->fd_set); + calc_max_fd(loop); + } } /*** SIGNAL WATCHERS ***/ @@ -396,7 +425,7 @@ void obt_main_loop_signal_add(ObtMainLoop *loop, g_return_if_fail(signal < NUM_SIGNALS); - h = g_new(ObtMainLoopSignalHandlerType, 1); + h = g_slice_new(ObtMainLoopSignalHandlerType); h->loop = loop; h->signal = signal; h->func = handler; @@ -444,7 +473,7 @@ void obt_main_loop_signal_remove(ObtMainLoop *loop, g_slist_delete_link(loop->signal_handlers[i], it); if (h->destroy) h->destroy(h->data); - g_free(h); + g_slice_free(ObtMainLoopSignalHandlerType, h); } } } @@ -476,7 +505,7 @@ void obt_main_loop_fd_add(ObtMainLoop *loop, { ObtMainLoopFdHandlerType *h; - h = g_new(ObtMainLoopFdHandlerType, 1); + h = g_slice_new(ObtMainLoopFdHandlerType); h->loop = loop; h->fd = fd; h->func = handler; @@ -496,12 +525,14 @@ static void fd_handler_destroy(gpointer data) if (h->destroy) h->destroy(h->data); + g_slice_free(ObtMainLoopFdHandlerType, h); } void obt_main_loop_fd_remove(ObtMainLoop *loop, gint fd) { g_hash_table_remove(loop->fd_handlers, &fd); + calc_max_fd(loop); } /*** TIMEOUTS ***/ @@ -520,7 +551,7 @@ static void insert_timer(ObtMainLoop *loop, ObtMainLoopTimer *ins) { GSList *it; for (it = loop->timers; it; it = g_slist_next(it)) { - ObMainLoopTimer *t = it->data; + ObtMainLoopTimer *t = it->data; if (timecompare(&ins->timeout, &t->timeout) <= 0) { loop->timers = g_slist_insert_before(loop->timers, it, ins); break; @@ -537,7 +568,7 @@ void obt_main_loop_timeout_add(ObtMainLoop *loop, GEqualFunc cmp, GDestroyNotify notify) { - ObMainLoopTimer *t = g_new(ObMainLoopTimer, 1); + ObtMainLoopTimer *t = g_slice_new(ObtMainLoopTimer); g_assert(microseconds > 0); /* if it's 0 it'll cause an infinite loop */ @@ -625,7 +656,7 @@ static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait) loop->timers = g_slist_delete_link(loop->timers, it); if (curr->destroy) curr->destroy(curr->data); - g_free(curr); + g_slice_free(ObtMainLoopTimer, curr); continue; } @@ -646,7 +677,7 @@ static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait) } else { if (curr->destroy) curr->destroy(curr->data); - g_free(curr); + g_slice_free(ObtMainLoopTimer, curr); } /* the timer queue has been shuffled, start from the beginning