2 #include "extensions.h"
11 static GSList **funcs;
13 void dispatch_startup()
24 funcs = g_new(GSList*, i);
26 for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
30 void dispatch_shutdown()
36 for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) {
37 for (it = funcs[i]; it != NULL; it = it->next)
39 g_slist_free(funcs[i]);
46 void dispatch_register(EventMask mask, EventHandler h, void *data)
54 /* add to masks it needs to be registered for */
57 for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
59 for (it = funcs[i]; it != NULL; it = it->next) {
61 if (f->h == h && f->data == data)
64 if (it == NULL) { /* wasn't already regged */
68 funcs[i] = g_slist_append(funcs[i], f);
70 m ^= j; /* remove from the mask */
72 g_assert(j >= EVENT_RANGE); /* an invalid event is in the mask */
75 /* remove from masks its not registered for anymore */
76 for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) {
78 for (it = funcs[i]; it != NULL; it = next) {
81 if (f->h == h && f->data == data) {
83 funcs[i] = g_slist_delete_link(funcs[i], it);
89 void dispatch_x(XEvent *xe, Client *c)
98 e = Event_X_EnterNotify;
101 e = Event_X_LeaveNotify;
104 e = Event_X_KeyPress;
107 e = Event_X_KeyRelease;
110 e = Event_X_ButtonPress;
113 e = Event_X_ButtonRelease;
116 e = Event_X_MotionNotify;
120 if (xe->type == extensions_xkb_event_basep) {
121 switch (((XkbAnyEvent*)&e)->xkb_type) {
132 obe.data.x.client = c;
140 for (it = funcs[i]; it != NULL; it = it->next) {
146 void dispatch_client(EventType e, Client *c, int num0, int num1)
155 obe.data.c.client = c;
156 obe.data.c.num[0] = num0;
157 obe.data.c.num[1] = num1;
165 for (it = funcs[i]; it != NULL; it = it->next) {
171 void dispatch_ob(EventType e, int num0, int num1)
178 obe.data.o.num[0] = num0;
179 obe.data.o.num[1] = num1;
187 for (it = funcs[i]; it != NULL; it = it->next) {
193 void dispatch_signal(int signal)
196 EventType e = Event_Signal;
201 obe.data.s.signal = signal;
209 for (it = funcs[i]; it != NULL; it = it->next) {