2 #include "extensions.h"
11 static GSList
**funcs
;
13 void dispatch_startup()
24 funcs
= g_new(GSList
*, i
);
26 for (i
= 0, j
= 1; j
< EVENT_RANGE
; ++i
, j
<<= 1)
30 void dispatch_shutdown()
36 for (i
= 0, j
= 1; j
< EVENT_RANGE
; ++i
, j
<<= 1) {
37 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
)
39 g_slist_free(funcs
[i
]);
46 void dispatch_register(EventMask mask
, EventHandler h
, void *data
)
54 /* add to masks it needs to be registered for */
57 for (i
= 0, j
= 1; j
< EVENT_RANGE
; ++i
, j
<<= 1)
59 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
) {
61 if (f
->h
== h
&& f
->data
== data
)
64 if (it
== NULL
) { /* wasn't already regged */
68 funcs
[i
] = g_slist_append(funcs
[i
], f
);
70 m
^= j
; /* remove from the mask */
72 g_assert(j
>= EVENT_RANGE
); /* an invalid event is in the mask */
75 /* remove from masks its not registered for anymore */
76 for (i
= 0, j
= 1; j
< EVENT_RANGE
; ++i
, j
<<= 1) {
78 for (it
= funcs
[i
]; it
!= NULL
; it
= next
) {
81 if (f
->h
== h
&& f
->data
== data
) {
83 funcs
[i
] = g_slist_delete_link(funcs
[i
], it
);
89 void dispatch_x(XEvent
*xe
, Client
*c
)
98 e
= Event_X_EnterNotify
;
101 e
= Event_X_LeaveNotify
;
104 e
= Event_X_KeyPress
;
107 e
= Event_X_KeyRelease
;
110 e
= Event_X_ButtonPress
;
113 e
= Event_X_ButtonRelease
;
116 e
= Event_X_MotionNotify
;
120 if (xe
->type
== extensions_xkb_event_basep
) {
121 switch (((XkbAnyEvent
*)&e
)->xkb_type
) {
132 obe
.data
.x
.client
= c
;
140 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
) {
146 void dispatch_client(EventType e
, Client
*c
, int num0
, int num1
)
155 obe
.data
.c
.client
= c
;
156 obe
.data
.c
.num
[0] = num0
;
157 obe
.data
.c
.num
[1] = num1
;
165 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
) {
171 void dispatch_ob(EventType e
, int num0
, int num1
)
178 obe
.data
.o
.num
[0] = num0
;
179 obe
.data
.o
.num
[1] = num1
;
187 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
) {
193 void dispatch_signal(int signal
)
196 EventType e
= Event_Signal
;
201 obe
.data
.s
.signal
= signal
;
209 for (it
= funcs
[i
]; it
!= NULL
; it
= it
->next
) {