2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001 Sun Microsystems Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
23 #include <libbonobo.h>
24 #include "../spi-private.h"
25 #include "cspi-bonobo-listener.h"
31 AccessibleEventListenerCB event;
32 AccessibleKeystrokeListenerCB key_event;
38 GObjectClass *event_parent_class;
39 GObjectClass *keystroke_parent_class;
46 cspi_event_handler_new (gpointer method, gpointer user_data)
48 EventHandler *eh = g_new0 (EventHandler, 1);
50 eh->cb.method = method;
51 eh->user_data = user_data;
57 cspi_event_handler_free (EventHandler *handler)
63 cspi_event_list_remove_by_cb (GList *list, gpointer callback)
67 for (l = list; l; l = next)
69 EventHandler *eh = l->data;
72 list = g_list_delete_link (list, l);
74 cspi_event_handler_free (eh);
81 * Standard event dispatcher
84 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
85 GObject, spi_event_listener_get_type ())
88 cspi_event (SpiEventListener *listener,
89 Accessibility_Event *event)
92 CSpiEventListener *clistener = (CSpiEventListener *) listener;
93 AccessibleEvent aevent;
96 source = cspi_object_add_ref (event->source, TRUE);
98 aevent.type = event->type;
99 aevent.source = source;
100 aevent.detail1 = event->detail1;
101 aevent.detail2 = event->detail2;
103 /* FIXME: re-enterancy hazard on this list */
104 for (l = clistener->callbacks; l; l = l->next)
106 EventHandler *eh = l->data;
108 eh->cb.event (&aevent, eh->user_data);
111 cspi_object_unref (source);
115 cspi_event_listener_instance_init (CSpiEventListener *listener)
120 cspi_event_listener_finalize (GObject *object)
122 CSpiEventListener *listener = (CSpiEventListener *) object;
125 for (l = listener->callbacks; l; l = l->next)
127 cspi_event_handler_free (l->data);
130 g_list_free (listener->callbacks);
132 event_parent_class->finalize (object);
136 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
138 GObjectClass *object_class = (GObjectClass *) klass;
140 event_parent_class = g_type_class_peek_parent (klass);
141 object_class->finalize = cspi_event_listener_finalize;
143 klass->event = cspi_event;
147 cspi_event_listener_new (void)
149 CSpiEventListener *listener;
151 listener = g_object_new (cspi_event_listener_get_type (), NULL);
157 cspi_event_listener_add_cb (AccessibleEventListener *al,
158 AccessibleEventListenerCB callback,
161 CSpiEventListener *listener = al;
163 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
165 listener->callbacks = g_list_prepend (listener->callbacks,
166 cspi_event_handler_new (callback, user_data));
170 cspi_event_listener_remove_cb (AccessibleEventListener *al,
171 AccessibleEventListenerCB callback)
173 CSpiEventListener *listener = al;
175 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
177 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
181 * Key event dispatcher
184 cspi_key_event (SpiKeystrokeListener *listener,
185 const Accessibility_DeviceEvent *keystroke)
188 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
189 AccessibleKeystroke akeystroke;
190 gboolean handled = FALSE;
192 #ifdef SPI_KEYEVENT_DEBUG
193 fprintf (stderr, "%s%c",
194 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
195 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
196 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
198 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
199 (long) keystroke->keyID,
200 (unsigned int) keystroke->modifiers,
201 (int) keystroke->keycode,
202 (long int) keystroke->timestamp);
205 switch (keystroke->type)
207 case Accessibility_KEY_PRESSED:
208 akeystroke.type = SPI_KEY_PRESSED;
210 case Accessibility_KEY_RELEASED:
211 akeystroke.type = SPI_KEY_RELEASED;
217 akeystroke.keyID = keystroke->id;
218 akeystroke.keycode = keystroke->hw_code;
219 akeystroke.timestamp = keystroke->timestamp;
220 akeystroke.keystring = g_strdup (keystroke->event_string);
221 akeystroke.modifiers = keystroke->modifiers;
223 /* FIXME: re-enterancy hazard on this list */
224 for (l = clistener->callbacks; l; l = l->next)
226 EventHandler *eh = l->data;
228 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
238 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
244 cspi_keystroke_listener_finalize (GObject *object)
246 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
249 for (l = listener->callbacks; l; l = l->next)
251 cspi_event_handler_free (l->data);
254 g_list_free (listener->callbacks);
256 keystroke_parent_class->finalize (object);
260 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
262 GObjectClass *object_class = (GObjectClass *) klass;
264 keystroke_parent_class = g_type_class_peek_parent (klass);
265 object_class->finalize = cspi_keystroke_listener_finalize;
267 klass->key_event = cspi_key_event;
270 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
271 spi_keystroke_listener_get_type (),
272 cspi_keystroke_listener);
275 cspi_keystroke_listener_new (void)
277 CSpiEventListener *listener;
279 listener = g_object_new (cspi_keystroke_listener_get_type (), NULL);
285 cspi_keystroke_listener_add_cb (AccessibleKeystrokeListener *al,
286 AccessibleKeystrokeListenerCB callback,
289 CSpiKeystrokeListener *listener = al;
291 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
293 listener->callbacks = g_list_prepend (listener->callbacks,
294 cspi_event_handler_new (callback, user_data));
298 cspi_keystroke_listener_remove_cb (AccessibleKeystrokeListener *al,
299 AccessibleKeystrokeListenerCB callback)
301 CSpiKeystrokeListener *listener = al;
303 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
305 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
309 cspi_event_listener_unref (AccessibleEventListener *listener)
311 bonobo_object_unref (BONOBO_OBJECT (listener));
315 cspi_keystroke_listener_unref (AccessibleKeystrokeListener *listener)
317 bonobo_object_unref (BONOBO_OBJECT (listener));
322 cspi_event_listener_get_corba (AccessibleEventListener *listener)
324 return BONOBO_OBJREF (listener);
328 cspi_keystroke_listener_get_corba (AccessibleKeystrokeListener *listener)
330 return BONOBO_OBJREF (listener);