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;
42 static guint32 _e_id = 0;
49 cspi_event_handler_new (gpointer method, gpointer user_data)
51 EventHandler *eh = g_new0 (EventHandler, 1);
53 eh->cb.method = method;
54 eh->user_data = user_data;
60 cspi_event_handler_free (EventHandler *handler)
66 cspi_event_list_remove_by_cb (GList *list, gpointer callback)
70 for (l = list; l; l = next)
72 EventHandler *eh = l->data;
75 list = g_list_delete_link (list, l);
77 cspi_event_handler_free (eh);
84 * Standard event dispatcher
87 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
88 GObject, spi_event_listener_get_type ())
91 cspi_event (SpiEventListener *listener,
92 Accessibility_Event *event)
95 CSpiEventListener *clistener = (CSpiEventListener *) listener;
96 InternalEvent *ievent;
97 AccessibleEvent *aevent;
98 Accessible *source = cspi_object_borrow (event->source);
100 ievent = g_new0(InternalEvent, 1);
101 ievent->event.type = g_strdup (event->type);
102 ievent->event.source = source;
103 ievent->event.detail1 = event->detail1;
104 ievent->event.detail2 = event->detail2;
105 ievent->id = _e_id++;
106 ievent->magic = SPI_INTERNAL_EVENT_MAGIC;
107 ievent->ref_count = 0;
108 ievent->data = CORBA_any__alloc ();
109 CORBA_any__copy (ievent->data, &event->any_data);
110 aevent = (AccessibleEvent *)ievent;
111 Accessible_ref (source);
112 AccessibleEvent_ref (aevent);
114 /* FIXME: re-enterancy hazard on this list */
115 for (l = clistener->callbacks; l; l = l->next)
117 EventHandler *eh = l->data;
118 /* cast hides our private stuff from client handlers */
119 eh->cb.event (aevent, eh->user_data);
122 AccessibleEvent_unref (aevent);
123 cspi_object_return (source);
127 cspi_event_listener_instance_init (CSpiEventListener *listener)
132 cspi_event_listener_finalize (GObject *object)
134 CSpiEventListener *listener = (CSpiEventListener *) object;
137 for (l = listener->callbacks; l; l = l->next)
139 cspi_event_handler_free (l->data);
142 g_list_free (listener->callbacks);
144 event_parent_class->finalize (object);
148 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
150 GObjectClass *object_class = (GObjectClass *) klass;
152 event_parent_class = g_type_class_peek_parent (klass);
153 object_class->finalize = cspi_event_listener_finalize;
155 klass->event = cspi_event;
159 cspi_event_listener_new (void)
161 CSpiEventListener *listener;
163 listener = g_object_new (cspi_event_listener_get_type (), NULL);
169 cspi_event_listener_add_cb (AccessibleEventListener *al,
170 AccessibleEventListenerCB callback,
173 CSpiEventListener *listener = al;
175 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
177 listener->callbacks = g_list_prepend (listener->callbacks,
178 cspi_event_handler_new ((void *) callback, user_data));
182 cspi_event_listener_remove_cb (AccessibleEventListener *al,
183 AccessibleEventListenerCB callback)
185 CSpiEventListener *listener = al;
187 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
189 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, (void *) callback);
193 * Device event handler
196 cspi_device_event (SpiDeviceListener *listener,
197 const Accessibility_DeviceEvent *event)
200 CSpiDeviceListener *clistener = (CSpiDeviceListener *) listener;
201 AccessibleDeviceEvent anevent;
202 gboolean handled = FALSE;
206 case Accessibility_KEY_PRESSED_EVENT:
207 anevent.type = SPI_KEY_PRESSED;
209 case Accessibility_KEY_RELEASED_EVENT:
210 anevent.type = SPI_KEY_RELEASED;
212 case Accessibility_BUTTON_PRESSED_EVENT:
213 anevent.type = SPI_BUTTON_PRESSED;
215 case Accessibility_BUTTON_RELEASED_EVENT:
216 anevent.type = SPI_BUTTON_RELEASED;
222 anevent.keyID = event->id;
223 anevent.keycode = event->hw_code;
224 anevent.timestamp = event->timestamp;
225 anevent.keystring = g_strdup (event->event_string);
226 anevent.modifiers = event->modifiers;
227 anevent.is_text = event->is_text;
229 /* FIXME: re-enterancy hazard on this list */
230 for (l = clistener->callbacks; l; l = l->next)
232 EventHandler *eh = l->data;
234 if ((handled = eh->cb.device_event (&anevent, eh->user_data)))
244 cspi_device_listener_init (CSpiDeviceListener *listener)
249 cspi_device_listener_finalize (GObject *object)
251 CSpiDeviceListener *listener = (CSpiDeviceListener *) object;
254 for (l = listener->callbacks; l; l = l->next)
256 cspi_event_handler_free (l->data);
259 g_list_free (listener->callbacks);
261 device_parent_class->finalize (object);
265 cspi_device_listener_class_init (CSpiDeviceListenerClass *klass)
267 GObjectClass *object_class = (GObjectClass *) klass;
269 device_parent_class = g_type_class_peek_parent (klass);
270 object_class->finalize = cspi_device_listener_finalize;
272 klass->device_event = cspi_device_event;
275 BONOBO_TYPE_FUNC (CSpiDeviceListener,
276 spi_device_listener_get_type (),
277 cspi_device_listener)
280 cspi_device_listener_new (void)
282 CSpiEventListener *listener = g_object_new (cspi_device_listener_get_type (), NULL);
288 cspi_device_listener_add_cb (AccessibleDeviceListener *al,
289 AccessibleDeviceListenerCB callback,
292 CSpiDeviceListener *listener = al;
294 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
296 listener->callbacks = g_list_prepend (listener->callbacks,
297 cspi_event_handler_new ((void *)callback, user_data));
301 cspi_device_listener_remove_cb (AccessibleDeviceListener *al,
302 AccessibleDeviceListenerCB callback)
304 CSpiDeviceListener *listener = al;
306 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
308 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, (void *) callback);
312 cspi_event_listener_unref (AccessibleEventListener *listener)
314 bonobo_object_unref (BONOBO_OBJECT (listener));
318 cspi_device_listener_unref (AccessibleDeviceListener *listener)
320 bonobo_object_unref (BONOBO_OBJECT (listener));
325 cspi_event_listener_get_corba (AccessibleEventListener *listener)
327 return BONOBO_OBJREF (listener);
331 cspi_device_listener_get_corba (AccessibleDeviceListener *listener)
333 return BONOBO_OBJREF (listener);