2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2002 Ximian Inc.
6 * Copyright 2002 Sun Microsystems, Inc.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
24 #include <libbonobo.h>
25 #include "../spi-private.h"
26 #include "cspi-bonobo-listener.h"
32 AccessibleEventListenerCB event;
33 AccessibleDeviceListenerCB device_event;
39 GObjectClass *event_parent_class;
40 GObjectClass *device_parent_class;
47 cspi_event_handler_new (gpointer method, gpointer user_data)
49 EventHandler *eh = g_new0 (EventHandler, 1);
51 eh->cb.method = method;
52 eh->user_data = user_data;
58 cspi_event_handler_free (EventHandler *handler)
64 cspi_event_list_remove_by_cb (GList *list, gpointer callback)
68 for (l = list; l; l = next)
70 EventHandler *eh = l->data;
73 list = g_list_delete_link (list, l);
75 cspi_event_handler_free (eh);
82 * Standard event dispatcher
85 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
86 GObject, spi_event_listener_get_type ())
89 cspi_event (SpiEventListener *listener,
90 Accessibility_Event *event)
93 CSpiEventListener *clistener = (CSpiEventListener *) listener;
95 Accessible *source = cspi_object_borrow (event->source);
97 aevent.event.type = event->type;
98 aevent.event.source = source;
99 aevent.event.detail1 = event->detail1;
100 aevent.event.detail2 = event->detail2;
101 aevent.data = &event->any_data;
103 /* FIXME: re-enterancy hazard on this list */
104 for (l = clistener->callbacks; l; l = l->next)
106 EventHandler *eh = l->data;
107 /* cast hides our private stuff from client handlers */
108 eh->cb.event ((AccessibleEvent *) &aevent, eh->user_data);
111 cspi_object_return (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 * Device event handler
184 cspi_device_event (SpiDeviceListener *listener,
185 const Accessibility_DeviceEvent *event)
188 CSpiDeviceListener *clistener = (CSpiDeviceListener *) listener;
189 AccessibleDeviceEvent anevent;
190 gboolean handled = FALSE;
194 case Accessibility_KEY_PRESSED_EVENT:
195 anevent.type = SPI_KEY_PRESSED;
197 case Accessibility_KEY_RELEASED_EVENT:
198 anevent.type = SPI_KEY_RELEASED;
200 case Accessibility_BUTTON_PRESSED_EVENT:
201 anevent.type = SPI_BUTTON_PRESSED;
203 case Accessibility_BUTTON_RELEASED_EVENT:
204 anevent.type = SPI_BUTTON_RELEASED;
210 anevent.keyID = event->id;
211 anevent.keycode = event->hw_code;
212 anevent.timestamp = event->timestamp;
213 anevent.keystring = g_strdup (event->event_string);
214 anevent.modifiers = event->modifiers;
216 /* FIXME: re-enterancy hazard on this list */
217 for (l = clistener->callbacks; l; l = l->next)
219 EventHandler *eh = l->data;
221 if ((handled = eh->cb.device_event (&anevent, eh->user_data)))
231 cspi_device_listener_init (CSpiDeviceListener *listener)
236 cspi_device_listener_finalize (GObject *object)
238 CSpiDeviceListener *listener = (CSpiDeviceListener *) object;
241 for (l = listener->callbacks; l; l = l->next)
243 cspi_event_handler_free (l->data);
246 g_list_free (listener->callbacks);
248 device_parent_class->finalize (object);
252 cspi_device_listener_class_init (CSpiDeviceListenerClass *klass)
254 GObjectClass *object_class = (GObjectClass *) klass;
256 device_parent_class = g_type_class_peek_parent (klass);
257 object_class->finalize = cspi_device_listener_finalize;
259 klass->device_event = cspi_device_event;
262 BONOBO_TYPE_FUNC (CSpiDeviceListener,
263 spi_device_listener_get_type (),
264 cspi_device_listener);
267 cspi_device_listener_new (void)
269 CSpiEventListener *listener = g_object_new (cspi_device_listener_get_type (), NULL);
275 cspi_device_listener_add_cb (AccessibleDeviceListener *al,
276 AccessibleDeviceListenerCB callback,
279 CSpiDeviceListener *listener = al;
281 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
283 listener->callbacks = g_list_prepend (listener->callbacks,
284 cspi_event_handler_new (callback, user_data));
288 cspi_device_listener_remove_cb (AccessibleDeviceListener *al,
289 AccessibleDeviceListenerCB callback)
291 CSpiDeviceListener *listener = al;
293 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
295 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, callback);
299 cspi_event_listener_unref (AccessibleEventListener *listener)
301 bonobo_object_unref (BONOBO_OBJECT (listener));
305 cspi_device_listener_unref (AccessibleDeviceListener *listener)
307 bonobo_object_unref (BONOBO_OBJECT (listener));
312 cspi_event_listener_get_corba (AccessibleEventListener *listener)
314 return BONOBO_OBJREF (listener);
318 cspi_device_listener_get_corba (AccessibleDeviceListener *listener)
320 return BONOBO_OBJREF (listener);