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;
94 Accessible *source = cspi_object_add (cspi_dup_ref(event->source));
96 aevent.type = event->type;
97 aevent.source = source;
98 aevent.detail1 = event->detail1;
99 aevent.detail2 = event->detail2;
101 /* FIXME: re-enterancy hazard on this list */
102 for (l = clistener->callbacks; l; l = l->next)
104 EventHandler *eh = l->data;
106 eh->cb.event (&aevent, eh->user_data);
109 cspi_object_unref( source );
113 cspi_event_listener_instance_init (CSpiEventListener *listener)
118 cspi_event_listener_finalize (GObject *object)
120 CSpiEventListener *listener = (CSpiEventListener *) object;
123 for (l = listener->callbacks; l; l = l->next)
125 cspi_event_handler_free (l->data);
128 g_list_free (listener->callbacks);
130 event_parent_class->finalize (object);
134 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
136 GObjectClass *object_class = (GObjectClass *) klass;
138 event_parent_class = g_type_class_peek_parent (klass);
139 object_class->finalize = cspi_event_listener_finalize;
141 klass->event = cspi_event;
145 cspi_event_listener_new (void)
147 CSpiEventListener *listener;
149 listener = g_object_new (cspi_event_listener_get_type (), NULL);
155 cspi_event_listener_add_cb (AccessibleEventListener *al,
156 AccessibleEventListenerCB callback,
159 CSpiEventListener *listener = al;
161 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
163 listener->callbacks = g_list_prepend (listener->callbacks,
164 cspi_event_handler_new (callback, user_data));
168 cspi_event_listener_remove_cb (AccessibleEventListener *al,
169 AccessibleEventListenerCB callback)
171 CSpiEventListener *listener = al;
173 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
175 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
179 * Key event dispatcher
182 cspi_key_event (SpiKeystrokeListener *listener,
183 const Accessibility_DeviceEvent *keystroke)
186 CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
187 AccessibleKeystroke akeystroke;
188 gboolean handled = FALSE;
190 #ifdef SPI_KEYEVENT_DEBUG
191 fprintf (stderr, "%s%c",
192 (keystroke->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
193 ((keystroke->modifiers & SPI_KEYMASK_SHIFT)^(keystroke->modifiers & SPI_KEYMASK_SHIFTLOCK))?
194 (char) toupper((int) keystroke->keyID) : (char) tolower((int) keystroke->keyID));
196 fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
197 (long) keystroke->keyID,
198 (unsigned int) keystroke->modifiers,
199 (int) keystroke->keycode,
200 (long int) keystroke->timestamp);
203 switch (keystroke->type)
205 case Accessibility_KEY_PRESSED:
206 akeystroke.type = SPI_KEY_PRESSED;
208 case Accessibility_KEY_RELEASED:
209 akeystroke.type = SPI_KEY_RELEASED;
215 akeystroke.keyID = keystroke->id;
216 akeystroke.keycode = keystroke->hw_code;
217 akeystroke.timestamp = keystroke->timestamp;
218 akeystroke.keystring = g_strdup (keystroke->event_string);
219 akeystroke.modifiers = keystroke->modifiers;
221 /* FIXME: re-enterancy hazard on this list */
222 for (l = clistener->callbacks; l; l = l->next)
224 EventHandler *eh = l->data;
226 if ((handled = eh->cb.key_event (&akeystroke, eh->user_data)))
236 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
242 cspi_keystroke_listener_finalize (GObject *object)
244 CSpiKeystrokeListener *listener = (CSpiKeystrokeListener *) object;
247 for (l = listener->callbacks; l; l = l->next)
249 cspi_event_handler_free (l->data);
252 g_list_free (listener->callbacks);
254 keystroke_parent_class->finalize (object);
258 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
260 GObjectClass *object_class = (GObjectClass *) klass;
262 keystroke_parent_class = g_type_class_peek_parent (klass);
263 object_class->finalize = cspi_keystroke_listener_finalize;
265 klass->key_event = cspi_key_event;
268 BONOBO_TYPE_FUNC (CSpiKeystrokeListener,
269 spi_keystroke_listener_get_type (),
270 cspi_keystroke_listener);
273 cspi_keystroke_listener_new (void)
275 CSpiEventListener *listener;
277 listener = g_object_new (cspi_keystroke_listener_get_type (), NULL);
283 cspi_keystroke_listener_add_cb (AccessibleKeystrokeListener *al,
284 AccessibleKeystrokeListenerCB callback,
287 CSpiKeystrokeListener *listener = al;
289 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
291 listener->callbacks = g_list_prepend (listener->callbacks,
292 cspi_event_handler_new (callback, user_data));
296 cspi_keystroke_listener_remove_cb (AccessibleKeystrokeListener *al,
297 AccessibleKeystrokeListenerCB callback)
299 CSpiKeystrokeListener *listener = al;
301 g_return_if_fail (CSPI_IS_KEYSTROKE_LISTENER (listener));
303 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
307 cspi_event_listener_unref (AccessibleEventListener *listener)
309 bonobo_object_unref (BONOBO_OBJECT (listener));
313 cspi_keystroke_listener_unref (AccessibleKeystrokeListener *listener)
315 bonobo_object_unref (BONOBO_OBJECT (listener));
320 cspi_event_listener_get_corba (AccessibleEventListener *listener)
322 return BONOBO_OBJREF (listener);
326 cspi_keystroke_listener_get_corba (AccessibleKeystrokeListener *listener)
328 return BONOBO_OBJREF (listener);