stop using python internally. add an event dispatcher
[dana/openbox.git] / openbox / dispatch.c
1 #include "dispatch.h"
2
3 #include <glib.h>
4
5 static GSList **funcs;
6
7 void dispatch_startup()
8 {
9     guint i;
10     EventType j;
11
12     i = 0;
13     j = EVENT_RANGE;
14     while (j > 1) {
15         j >>= 1;
16         ++i;
17     }
18     funcs = g_new(GSList*, i);
19
20     for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
21         funcs[i] = NULL;
22 }
23
24 void dispatch_shutdown()
25 {
26     guint i;
27     EventType j;
28
29     for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
30         g_slist_free(funcs[i]);
31
32     g_free(funcs);
33 }
34
35 void dispatch_register(EventHandler h, EventMask mask)
36 {
37     guint i;
38     EventType j;
39
40     while (mask) {
41         for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
42             if (mask & j) {
43                 funcs[i] = g_slist_append(funcs[i], h);
44                 mask ^= j; /* remove from the mask */
45             }
46         g_assert(j >= EVENT_RANGE); /* an invalid event is in the mask */
47     }
48 }
49
50 void dispatch_x(XEvent *xe)
51 {
52     EventType e;
53     guint i;
54     GSList *it;
55     ObEvent obe;
56
57     switch (xe->type) {
58     case EnterNotify:
59         e = Event_X_EnterNotify;
60         break;
61     case LeaveNotify:
62         e = Event_X_LeaveNotify;
63         break;
64     case KeyPress:
65         e = Event_X_KeyPress;
66         break;
67     case KeyRelease:
68         e = Event_X_KeyRelease;
69         break;
70     case ButtonPress:
71         e = Event_X_ButtonPress;
72         break;
73     case ButtonRelease:
74         e = Event_X_ButtonRelease;
75         break;
76     case MotionNotify:
77         e = Event_X_MotionNotify;
78         break;
79     default:
80         return;
81     }
82
83     obe.type = e;
84     obe.data.x = xe;
85
86     i = 0;
87     while (e > 1) {
88         e >>= 1;
89         ++i;
90     }
91
92     for (it = funcs[i]; it != NULL; it = it->next)
93         ((EventHandler)it->data)(&obe);
94 }
95
96 void dispatch_client(EventType e, Client *c)
97 {
98     guint i;
99     GSList *it;
100     ObEvent obe;
101
102     obe.type = e;
103     obe.data.client = c;
104
105     i = 0;
106     while (e > 1) {
107         e >>= 1;
108         ++i;
109     }
110
111     for (it = funcs[i]; it != NULL; it = it->next)
112         ((EventHandler)it->data)(&obe);
113 }
114
115 void dispatch_ob(EventType e)
116 {
117     guint i;
118     GSList *it;
119     ObEvent obe;
120
121     obe.type = e;
122
123     i = 0;
124     while (e > 1) {
125         e >>= 1;
126         ++i;
127     }
128
129     for (it = funcs[i]; it != NULL; it = it->next)
130         ((EventHandler)it->data)(&obe);
131 }
132
133 void dispatch_signal(int signal)
134 {
135     guint i;
136     EventType e = Event_Signal;
137     GSList *it;
138     ObEvent obe;
139
140     obe.type = e;
141     obe.data.signal = signal;
142
143     i = 0;
144     while (e > 1) {
145         e >>= 1;
146         ++i;
147     }
148
149     for (it = funcs[i]; it != NULL; it = it->next)
150         ((EventHandler)it->data)(&obe);
151 }