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