1 #include <cspi/spi-private.h>
2 #include <cspi/spi-listener-impl.h>
8 AccessibleEventListenerCB event;
9 AccessibleKeystrokeListenerCB key_event;
15 GObjectClass *event_parent_class;
16 GObjectClass *keystroke_parent_class;
23 event_handler_new (gpointer method, gpointer user_data)
25 EventHandler *eh = g_new0 (EventHandler, 1);
27 eh->cb.method = method;
28 eh->user_data = user_data;
34 event_handler_free (EventHandler *handler)
40 event_list_remove_by_callback (GList *list, gpointer callback)
44 for (l = list; l; l = next)
46 EventHandler *eh = l->data;
49 list = g_list_delete_link (list, l);
51 event_handler_free (eh);
58 * Standard event dispatcher
61 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
62 GObject, spi_event_listener_get_type ())
65 cspi_event (SpiEventListener *listener,
66 Accessibility_Event *event)
69 CSpiEventListener *clistener = (CSpiEventListener *) listener;
70 AccessibleEvent aevent;
72 aevent.type = event->type;
73 aevent.source = cspi_object_add_check (bonobo_object_dup_ref (event->source, cspi_ev ()));
74 aevent.detail1 = event->detail1;
75 aevent.detail2 = event->detail2;
77 /* FIXME: re-enterancy hazard on this list */
78 for (l = clistener->callbacks; l; l = l->next)
80 EventHandler *eh = l->data;
82 eh->cb.event (&aevent, eh->user_data);
85 cspi_object_unref (aevent.source);
89 cspi_event_listener_instance_init (CSpiEventListener *listener)
94 cspi_event_listener_finalize (GObject *object)
96 CSpiEventListener *listener = (CSpiEventListener *) object;
99 for (l = listener->callbacks; l; l = l->next)
101 event_handler_free (l->data);
104 g_list_free (listener->callbacks);
106 event_parent_class->finalize (object);
110 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
112 GObjectClass *object_class = (GObjectClass *) klass;
114 event_parent_class = g_type_class_peek_parent (klass);
115 object_class->finalize = cspi_event_listener_finalize;
117 klass->event = cspi_event;
121 cspi_event_listener_new (void)
123 return g_object_new (cspi_event_listener_get_type (), NULL);
127 cspi_event_listener_add_callback (CSpiEventListener *listener,
128 AccessibleEventListenerCB callback,
131 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
132 listener->callbacks = g_list_prepend (listener->callbacks,
133 event_handler_new (callback, user_data));
137 cspi_event_listener_remove_callback (CSpiEventListener *listener,
138 AccessibleEventListenerCB callback)
140 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
141 listener->callbacks = event_list_remove_by_callback (listener->callbacks, callback);
145 * Key event dispatcher
149 cspi_key_event (SpiKeystrokeListener *listener,
150 const Accessibility_KeyStroke *keystroke)
153 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
154 AccessibleKeystroke akeystroke;
155 gboolean handled = FALSE;
157 #ifdef SPI_KEYEVENT_DEBUG
158 fprintf (stderr, "%s%c",
159 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
160 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
161 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
163 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
164 (long) keystroke->keyID,
165 (unsigned int) keystroke->modifiers,
166 (int) keystroke->keycode,
167 (long int) keystroke->timestamp);
170 switch (keystroke->type)
172 case Accessibility_KEY_PRESSED:
173 akeystroke.type = SPI_KEY_PRESSED;
175 case Accessibility_KEY_RELEASED:
176 akeystroke.type = SPI_KEY_RELEASED;
182 akeystroke.keyID = keystroke->keyID;
183 akeystroke.keycode = keystroke->keycode;
184 akeystroke.timestamp = keystroke->timestamp;
185 akeystroke.modifiers = keystroke->modifiers;
187 /* FIXME: re-enterancy hazard on this list */
188 for (l = clistener->callbacks; l; l = l->next)
190 EventHandler *eh = l->data;
192 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
202 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
208 cspi_keystroke_listener_finalize (GObject *object)
210 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
213 for (l = listener->callbacks; l; l = l->next)
215 event_handler_free (l->data);
218 g_list_free (listener->callbacks);
220 keystroke_parent_class->finalize (object);
224 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
226 GObjectClass *object_class = (GObjectClass *) klass;
228 keystroke_parent_class = g_type_class_peek_parent (klass);
229 object_class->finalize = cspi_keystroke_listener_finalize;
231 klass->key_event = cspi_key_event;
234 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
235 spi_keystroke_listener_get_type (),
236 cspi_keystroke_listener);
238 CSpiKeystrokeListener *
239 cspi_keystroke_listener_new (void)
241 return g_object_new (cspi_keystroke_listener_get_type (), NULL);
245 cspi_keystroke_listener_add_callback (CSpiKeystrokeListener *listener,
246 AccessibleKeystrokeListenerCB callback,
249 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
250 listener->callbacks = g_list_prepend (listener->callbacks,
251 event_handler_new (callback, user_data));
255 cspi_keystroke_listener_remove_callback (CSpiKeystrokeListener *listener,
256 AccessibleKeystrokeListenerCB callback)
258 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
259 listener->callbacks = event_list_remove_by_callback (listener->callbacks, callback);