]> Dogcows Code - chaz/openbox/blob - openbox/dispatch.c
stop using python internally. add an event dispatcher
[chaz/openbox] / 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 }
This page took 0.041677 seconds and 5 git commands to generate.