summaryrefslogtreecommitdiff
path: root/openbox/dispatch.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-03-17 19:54:37 +0000
committerDana Jansens <danakj@orodu.net>2003-03-17 19:54:37 +0000
commit9b33f7ded69e22ad18169c45b6b340dcb348e072 (patch)
tree521a3f9eedba1baf94a5480ea32c628439dafd3d /openbox/dispatch.c
parent055b459cdf8e8f15d17cb3366cfde31406fa6223 (diff)
stop using python internally. add an event dispatcher
Diffstat (limited to 'openbox/dispatch.c')
-rw-r--r--openbox/dispatch.c151
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);
+}