]> Dogcows Code - chaz/openbox/blob - openbox/dispatch.c
make sure theres always a client for client events
[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 g_assert(c != NULL);
115
116 obe.type = e;
117 obe.data.client = c;
118
119 i = 0;
120 while (e > 1) {
121 e >>= 1;
122 ++i;
123 }
124
125 for (it = funcs[i]; it != NULL; it = it->next)
126 ((EventHandler)it->data)(&obe);
127 }
128
129 void dispatch_ob(EventType e)
130 {
131 guint i;
132 GSList *it;
133 ObEvent obe;
134
135 obe.type = e;
136
137 i = 0;
138 while (e > 1) {
139 e >>= 1;
140 ++i;
141 }
142
143 for (it = funcs[i]; it != NULL; it = it->next)
144 ((EventHandler)it->data)(&obe);
145 }
146
147 void dispatch_signal(int signal)
148 {
149 guint i;
150 EventType e = Event_Signal;
151 GSList *it;
152 ObEvent obe;
153
154 obe.type = e;
155 obe.data.signal = signal;
156
157 i = 0;
158 while (e > 1) {
159 e >>= 1;
160 ++i;
161 }
162
163 for (it = funcs[i]; it != NULL; it = it->next)
164 ((EventHandler)it->data)(&obe);
165 }
This page took 0.055092 seconds and 5 git commands to generate.