]> icculus.org git repositories - mikachu/openbox.git/blob - openbox/dispatch.c
all events are dispatched
[mikachu/openbox.git] / 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 }