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;
73 source = cspi_object_add_check (bonobo_object_dup_ref (event->source, cspi_ev ()));
75 aevent.type = event->type;
76 aevent.source = source;
77 aevent.detail1 = event->detail1;
78 aevent.detail2 = event->detail2;
80 /* FIXME: re-enterancy hazard on this list */
81 for (l = clistener->callbacks; l; l = l->next)
83 EventHandler *eh = l->data;
85 eh->cb.event (&aevent, eh->user_data);
88 cspi_object_unref (source);
92 cspi_event_listener_instance_init (CSpiEventListener *listener)
97 cspi_event_listener_finalize (GObject *object)
99 CSpiEventListener *listener = (CSpiEventListener *) object;
102 for (l = listener->callbacks; l; l = l->next)
104 event_handler_free (l->data);
107 g_list_free (listener->callbacks);
109 event_parent_class->finalize (object);
113 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
115 GObjectClass *object_class = (GObjectClass *) klass;
117 event_parent_class = g_type_class_peek_parent (klass);
118 object_class->finalize = cspi_event_listener_finalize;
120 klass->event = cspi_event;
124 cspi_event_listener_new (void)
126 return g_object_new (cspi_event_listener_get_type (), NULL);
130 cspi_event_listener_add_callback (CSpiEventListener *listener,
131 AccessibleEventListenerCB callback,
134 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
135 listener->callbacks = g_list_prepend (listener->callbacks,
136 event_handler_new (callback, user_data));
140 cspi_event_listener_remove_callback (CSpiEventListener *listener,
141 AccessibleEventListenerCB callback)
143 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
144 listener->callbacks = event_list_remove_by_callback (listener->callbacks, callback);
148 * Key event dispatcher
152 cspi_key_event (SpiKeystrokeListener *listener,
153 const Accessibility_KeyStroke *keystroke)
156 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
157 AccessibleKeystroke akeystroke;
158 gboolean handled = FALSE;
160 #ifdef SPI_KEYEVENT_DEBUG
161 fprintf (stderr, "%s%c",
162 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
163 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
164 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
166 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
167 (long) keystroke->keyID,
168 (unsigned int) keystroke->modifiers,
169 (int) keystroke->keycode,
170 (long int) keystroke->timestamp);
173 switch (keystroke->type)
175 case Accessibility_KEY_PRESSED:
176 akeystroke.type = SPI_KEY_PRESSED;
178 case Accessibility_KEY_RELEASED:
179 akeystroke.type = SPI_KEY_RELEASED;
185 akeystroke.keyID = keystroke->keyID;
186 akeystroke.keycode = keystroke->keycode;
187 akeystroke.timestamp = keystroke->timestamp;
188 akeystroke.modifiers = keystroke->modifiers;
190 /* FIXME: re-enterancy hazard on this list */
191 for (l = clistener->callbacks; l; l = l->next)
193 EventHandler *eh = l->data;
195 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
205 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
211 cspi_keystroke_listener_finalize (GObject *object)
213 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
216 for (l = listener->callbacks; l; l = l->next)
218 event_handler_free (l->data);
221 g_list_free (listener->callbacks);
223 keystroke_parent_class->finalize (object);
227 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
229 GObjectClass *object_class = (GObjectClass *) klass;
231 keystroke_parent_class = g_type_class_peek_parent (klass);
232 object_class->finalize = cspi_keystroke_listener_finalize;
234 klass->key_event = cspi_key_event;
237 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
238 spi_keystroke_listener_get_type (),
239 cspi_keystroke_listener);
241 CSpiKeystrokeListener *
242 cspi_keystroke_listener_new (void)
244 return g_object_new (cspi_keystroke_listener_get_type (), NULL);
248 cspi_keystroke_listener_add_callback (CSpiKeystrokeListener *listener,
249 AccessibleKeystrokeListenerCB callback,
252 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
253 listener->callbacks = g_list_prepend (listener->callbacks,
254 event_handler_new (callback, user_data));
258 cspi_keystroke_listener_remove_callback (CSpiKeystrokeListener *listener,
259 AccessibleKeystrokeListenerCB callback)
261 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
262 listener->callbacks = event_list_remove_by_callback (listener->callbacks, callback);