From 9b33f7ded69e22ad18169c45b6b340dcb348e072 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 17 Mar 2003 19:54:37 +0000 Subject: stop using python internally. add an event dispatcher --- openbox/dispatch.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 openbox/dispatch.c (limited to 'openbox/dispatch.c') diff --git a/openbox/dispatch.c b/openbox/dispatch.c new file mode 100644 index 00000000..c710dec7 --- /dev/null +++ b/openbox/dispatch.c @@ -0,0 +1,151 @@ +#include "dispatch.h" + +#include + +static GSList **funcs; + +void dispatch_startup() +{ + guint i; + EventType j; + + i = 0; + j = EVENT_RANGE; + while (j > 1) { + j >>= 1; + ++i; + } + funcs = g_new(GSList*, i); + + for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) + funcs[i] = NULL; +} + +void dispatch_shutdown() +{ + guint i; + EventType j; + + for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) + g_slist_free(funcs[i]); + + g_free(funcs); +} + +void dispatch_register(EventHandler h, EventMask mask) +{ + guint i; + EventType j; + + while (mask) { + for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) + if (mask & j) { + funcs[i] = g_slist_append(funcs[i], h); + mask ^= j; /* remove from the mask */ + } + g_assert(j >= EVENT_RANGE); /* an invalid event is in the mask */ + } +} + +void dispatch_x(XEvent *xe) +{ + EventType e; + guint i; + GSList *it; + ObEvent obe; + + switch (xe->type) { + case EnterNotify: + e = Event_X_EnterNotify; + break; + case LeaveNotify: + e = Event_X_LeaveNotify; + break; + case KeyPress: + e = Event_X_KeyPress; + break; + case KeyRelease: + e = Event_X_KeyRelease; + break; + case ButtonPress: + e = Event_X_ButtonPress; + break; + case ButtonRelease: + e = Event_X_ButtonRelease; + break; + case MotionNotify: + e = Event_X_MotionNotify; + break; + default: + return; + } + + obe.type = e; + obe.data.x = xe; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) + ((EventHandler)it->data)(&obe); +} + +void dispatch_client(EventType e, Client *c) +{ + guint i; + GSList *it; + ObEvent obe; + + obe.type = e; + obe.data.client = c; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) + ((EventHandler)it->data)(&obe); +} + +void dispatch_ob(EventType e) +{ + guint i; + GSList *it; + ObEvent obe; + + obe.type = e; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) + ((EventHandler)it->data)(&obe); +} + +void dispatch_signal(int signal) +{ + guint i; + EventType e = Event_Signal; + GSList *it; + ObEvent obe; + + obe.type = e; + obe.data.signal = signal; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) + ((EventHandler)it->data)(&obe); +} -- cgit v1.2.3