diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-03-17 19:54:37 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-03-17 19:54:37 +0000 |
| commit | 9b33f7ded69e22ad18169c45b6b340dcb348e072 (patch) | |
| tree | 521a3f9eedba1baf94a5480ea32c628439dafd3d /openbox/dispatch.c | |
| parent | 055b459cdf8e8f15d17cb3366cfde31406fa6223 (diff) | |
stop using python internally. add an event dispatcher
Diffstat (limited to 'openbox/dispatch.c')
| -rw-r--r-- | openbox/dispatch.c | 151 |
1 files changed, 151 insertions, 0 deletions
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 <glib.h> + +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); +} |
