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.keystring = g_strdup (keystroke->event_string);
199 akeystroke.modifiers = keystroke->modifiers;
201 /* FIXME: re-enterancy hazard on this list */
202 for (l = clistener->callbacks; l; l = l->next)
204 EventHandler *eh = l->data;
206 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
216 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
222 cspi_keystroke_listener_finalize (GObject *object)
224 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
227 for (l = listener->callbacks; l; l = l->next)
229 cspi_event_handler_free (l->data);
232 g_list_free (listener->callbacks);
234 keystroke_parent_class->finalize (object);
238 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
240 GObjectClass *object_class = (GObjectClass *) klass;
242 keystroke_parent_class = g_type_class_peek_parent (klass);
243 object_class->finalize = cspi_keystroke_listener_finalize;
245 klass->key_event = cspi_key_event;
248 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
249 spi_keystroke_listener_get_type (),
250 cspi_keystroke_listener);
253 cspi_keystroke_listener_new (void)
255 CSpiEventListener *listener;
257 listener = g_object_new (cspi_keystroke_listener_get_type (), NULL);
263 cspi_keystroke_listener_add_cb (AccessibleKeystrokeListener *al,
264 AccessibleKeystrokeListenerCB callback,
267 CSpiKeystrokeListener *listener = al;
269 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
271 listener->callbacks = g_list_prepend (listener->callbacks,
272 cspi_event_handler_new (callback, user_data));
276 cspi_keystroke_listener_remove_cb (AccessibleKeystrokeListener *al,
277 AccessibleKeystrokeListenerCB callback)
279 CSpiKeystrokeListener *listener = al;
281 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
283 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
287 cspi_event_listener_unref (AccessibleEventListener *listener)
289 bonobo_object_unref (BONOBO_OBJECT (listener));
293 cspi_keystroke_listener_unref (AccessibleKeystrokeListener *listener)
295 bonobo_object_unref (BONOBO_OBJECT (listener));
300 cspi_event_listener_get_corba (AccessibleEventListener *listener)
302 return BONOBO_OBJREF (listener);
306 cspi_keystroke_listener_get_corba (AccessibleKeystrokeListener *listener)
308 return BONOBO_OBJREF (listener);