2 #include "../spi-private.h"
3 #include "cspi-bonobo-listener.h"
9 AccessibleEventListenerCB event;
10 AccessibleKeystrokeListenerCB key_event;
16 GObjectClass *event_parent_class;
17 GObjectClass *keystroke_parent_class;
24 cspi_event_handler_new (gpointer method, gpointer user_data)
26 EventHandler *eh = g_new0 (EventHandler, 1);
28 eh->cb.method = method;
29 eh->user_data = user_data;
35 cspi_event_handler_free (EventHandler *handler)
41 cspi_event_list_remove_by_cb (GList *list, gpointer callback)
45 for (l = list; l; l = next)
47 EventHandler *eh = l->data;
50 list = g_list_delete_link (list, l);
52 cspi_event_handler_free (eh);
59 * Standard event dispatcher
62 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
63 GObject, spi_event_listener_get_type ())
66 cspi_event (SpiEventListener *listener,
67 Accessibility_Event *event)
70 CSpiEventListener *clistener = (CSpiEventListener *) listener;
71 AccessibleEvent aevent;
74 source = cspi_object_add (bonobo_object_dup_ref (event->source, cspi_ev ()));
76 aevent.type = event->type;
77 aevent.source = source;
78 aevent.detail1 = event->detail1;
79 aevent.detail2 = event->detail2;
81 /* FIXME: re-enterancy hazard on this list */
82 for (l = clistener->callbacks; l; l = l->next)
84 EventHandler *eh = l->data;
86 eh->cb.event (&aevent, eh->user_data);
89 cspi_object_unref (source);
93 cspi_event_listener_instance_init (CSpiEventListener *listener)
98 cspi_event_listener_finalize (GObject *object)
100 CSpiEventListener *listener = (CSpiEventListener *) object;
103 for (l = listener->callbacks; l; l = l->next)
105 cspi_event_handler_free (l->data);
108 g_list_free (listener->callbacks);
110 event_parent_class->finalize (object);
114 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
116 GObjectClass *object_class = (GObjectClass *) klass;
118 event_parent_class = g_type_class_peek_parent (klass);
119 object_class->finalize = cspi_event_listener_finalize;
121 klass->event = cspi_event;
125 cspi_event_listener_new (void)
127 CSpiEventListener *listener;
129 listener = g_object_new (cspi_event_listener_get_type (), NULL);
135 cspi_event_listener_add_cb (AccessibleEventListener *al,
136 AccessibleEventListenerCB callback,
139 CSpiEventListener *listener = al;
141 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
143 listener->callbacks = g_list_prepend (listener->callbacks,
144 cspi_event_handler_new (callback, user_data));
148 cspi_event_listener_remove_cb (AccessibleEventListener *al,
149 AccessibleEventListenerCB callback)
151 CSpiEventListener *listener = al;
153 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
155 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
159 * Key event dispatcher
162 cspi_key_event (SpiKeystrokeListener *listener,
163 const Accessibility_DeviceEvent *keystroke)
166 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
167 AccessibleKeystroke akeystroke;
168 gboolean handled = FALSE;
170 #ifdef SPI_KEYEVENT_DEBUG
171 fprintf (stderr, "%s%c",
172 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
173 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
174 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
176 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
177 (long) keystroke->keyID,
178 (unsigned int) keystroke->modifiers,
179 (int) keystroke->keycode,
180 (long int) keystroke->timestamp);
183 switch (keystroke->type)
185 case Accessibility_KEY_PRESSED:
186 akeystroke.type = SPI_KEY_PRESSED;
188 case Accessibility_KEY_RELEASED:
189 akeystroke.type = SPI_KEY_RELEASED;
195 akeystroke.keyID = keystroke->id;
196 akeystroke.keycode = keystroke->hw_code;
197 akeystroke.timestamp = keystroke->timestamp;
198 akeystroke.modifiers = keystroke->modifiers;
200 /* FIXME: re-enterancy hazard on this list */
201 for (l = clistener->callbacks; l; l = l->next)
203 EventHandler *eh = l->data;
205 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
215 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
221 cspi_keystroke_listener_finalize (GObject *object)
223 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
226 for (l = listener->callbacks; l; l = l->next)
228 cspi_event_handler_free (l->data);
231 g_list_free (listener->callbacks);
233 keystroke_parent_class->finalize (object);
237 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
239 GObjectClass *object_class = (GObjectClass *) klass;
241 keystroke_parent_class = g_type_class_peek_parent (klass);
242 object_class->finalize = cspi_keystroke_listener_finalize;
244 klass->key_event = cspi_key_event;
247 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
248 spi_keystroke_listener_get_type (),
249 cspi_keystroke_listener);
252 cspi_keystroke_listener_new (void)
254 CSpiEventListener *listener;
256 listener = g_object_new (cspi_keystroke_listener_get_type (), NULL);
262 cspi_keystroke_listener_add_cb (AccessibleKeystrokeListener *al,
263 AccessibleKeystrokeListenerCB callback,
266 CSpiKeystrokeListener *listener = al;
268 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
270 listener->callbacks = g_list_prepend (listener->callbacks,
271 cspi_event_handler_new (callback, user_data));
275 cspi_keystroke_listener_remove_cb (AccessibleKeystrokeListener *al,
276 AccessibleKeystrokeListenerCB callback)
278 CSpiKeystrokeListener *listener = al;
280 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
282 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
286 cspi_event_listener_unref (AccessibleEventListener *listener)
288 bonobo_object_unref (BONOBO_OBJECT (listener));
292 cspi_keystroke_listener_unref (AccessibleKeystrokeListener *listener)
294 bonobo_object_unref (BONOBO_OBJECT (listener));
299 cspi_event_listener_get_corba (AccessibleEventListener *listener)
301 return BONOBO_OBJREF (listener);
305 cspi_keystroke_listener_get_corba (AccessibleKeystrokeListener *listener)
307 return BONOBO_OBJREF (listener);