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 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 event_handler_free (EventHandler *handler)
41 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 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 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);
131 return CORBA_Object_duplicate (BONOBO_OBJREF (listener), cspi_ev ());
135 cspi_event_listener_add_cb (AccessibleEventListener *al,
136 AccessibleEventListenerCB callback,
139 CSpiEventListener *listener = bonobo_object (
140 ORBit_small_get_servant (CSPI_OBJREF (al)));
142 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
144 listener->callbacks = g_list_prepend (listener->callbacks,
145 event_handler_new (callback, user_data));
149 cspi_event_listener_remove_cb (AccessibleEventListener *al,
150 AccessibleEventListenerCB callback)
152 CSpiEventListener *listener = bonobo_object (
153 ORBit_small_get_servant (CSPI_OBJREF (al)));
155 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
157 listener->callbacks = event_list_remove_by_cb (listener->callbacks, callback);
161 * Key event dispatcher
165 cspi_key_event (SpiKeystrokeListener *listener,
166 const Accessibility_KeyStroke *keystroke)
169 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
170 AccessibleKeystroke akeystroke;
171 gboolean handled = FALSE;
173 #ifdef SPI_KEYEVENT_DEBUG
174 fprintf (stderr, "%s%c",
175 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
176 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
177 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
179 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
180 (long) keystroke->keyID,
181 (unsigned int) keystroke->modifiers,
182 (int) keystroke->keycode,
183 (long int) keystroke->timestamp);
186 switch (keystroke->type)
188 case Accessibility_KEY_PRESSED:
189 akeystroke.type = SPI_KEY_PRESSED;
191 case Accessibility_KEY_RELEASED:
192 akeystroke.type = SPI_KEY_RELEASED;
198 akeystroke.keyID = keystroke->keyID;
199 akeystroke.keycode = keystroke->keycode;
200 akeystroke.timestamp = keystroke->timestamp;
201 akeystroke.modifiers = keystroke->modifiers;
203 /* FIXME: re-enterancy hazard on this list */
204 for (l = clistener->callbacks; l; l = l->next)
206 EventHandler *eh = l->data;
208 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
218 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
224 cspi_keystroke_listener_finalize (GObject *object)
226 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
229 for (l = listener->callbacks; l; l = l->next)
231 event_handler_free (l->data);
234 g_list_free (listener->callbacks);
236 keystroke_parent_class->finalize (object);
240 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
242 GObjectClass *object_class = (GObjectClass *) klass;
244 keystroke_parent_class = g_type_class_peek_parent (klass);
245 object_class->finalize = cspi_keystroke_listener_finalize;
247 klass->key_event = cspi_key_event;
250 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
251 spi_keystroke_listener_get_type (),
252 cspi_keystroke_listener);
255 cspi_keystroke_listener_new (void)
257 CSpiEventListener *listener;
259 listener = g_object_new (cspi_keystroke_listener_get_type (), NULL);
261 return CORBA_Object_duplicate (BONOBO_OBJREF (listener), cspi_ev ());
265 cspi_keystroke_listener_add_cb (AccessibleKeystrokeListener *al,
266 AccessibleKeystrokeListenerCB callback,
269 CSpiKeystrokeListener *listener = bonobo_object (
270 ORBit_small_get_servant (CSPI_OBJREF (al)));
272 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
274 listener->callbacks = g_list_prepend (listener->callbacks,
275 event_handler_new (callback, user_data));
279 cspi_keystroke_listener_remove_cb (AccessibleKeystrokeListener *al,
280 AccessibleKeystrokeListenerCB callback)
282 CSpiKeystrokeListener *listener = bonobo_object (
283 ORBit_small_get_servant (CSPI_OBJREF (al)));
285 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
287 listener->callbacks = event_list_remove_by_cb (listener->callbacks, callback);