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 if (eh->cb.method == callback)
77 list = g_list_delete_link (list, l);
78 cspi_event_handler_free (eh);
86 * Standard event dispatcher
89 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
90 GObject, spi_event_listener_get_type ())
93 cspi_event (SpiEventListener *listener,
94 Accessibility_Event *event)
97 CSpiEventListener *clistener = (CSpiEventListener *) listener;
98 InternalEvent *ievent;
99 AccessibleEvent *aevent;
100 Accessible *source = cspi_object_borrow (event->source);
102 ievent = g_new0(InternalEvent, 1);
103 ievent->event.type = g_strdup (event->type);
104 ievent->event.source = source;
105 ievent->event.detail1 = event->detail1;
106 ievent->event.detail2 = event->detail2;
107 ievent->id = _e_id++;
108 ievent->magic = SPI_INTERNAL_EVENT_MAGIC;
109 ievent->ref_count = 0;
110 ievent->data = CORBA_any__alloc ();
111 CORBA_any__copy (ievent->data, &event->any_data);
112 aevent = (AccessibleEvent *)ievent;
113 Accessible_ref (source);
114 AccessibleEvent_ref (aevent);
116 /* FIXME: re-enterancy hazard on this list */
117 for (l = clistener->callbacks; l; l = l->next)
119 EventHandler *eh = l->data;
120 /* cast hides our private stuff from client handlers */
121 eh->cb.event (aevent, eh->user_data);
124 AccessibleEvent_unref (aevent);
125 cspi_object_return (source);
129 cspi_event_listener_instance_init (CSpiEventListener *listener)
134 cspi_event_listener_finalize (GObject *object)
136 CSpiEventListener *listener = (CSpiEventListener *) object;
139 for (l = listener->callbacks; l; l = l->next)
141 cspi_event_handler_free (l->data);
144 g_list_free (listener->callbacks);
146 event_parent_class->finalize (object);
150 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
152 GObjectClass *object_class = (GObjectClass *) klass;
154 event_parent_class = g_type_class_peek_parent (klass);
155 object_class->finalize = cspi_event_listener_finalize;
157 klass->event = cspi_event;
161 cspi_event_listener_new (void)
163 CSpiEventListener *listener;
165 listener = g_object_new (cspi_event_listener_get_type (), NULL);
171 cspi_event_listener_add_cb (AccessibleEventListener *al,
172 AccessibleEventListenerCB callback,
175 CSpiEventListener *listener = al;
177 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
179 listener->callbacks = g_list_prepend (listener->callbacks,
180 cspi_event_handler_new ((void *) callback, user_data));
184 cspi_event_listener_remove_cb (AccessibleEventListener *al,
185 AccessibleEventListenerCB callback)
187 CSpiEventListener *listener = al;
189 g_return_if_fail (CSPI_IS_EVENT_LISTENER (listener));
191 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, (void *) callback);
195 * Device event handler
198 cspi_device_event (SpiDeviceListener *listener,
199 const Accessibility_DeviceEvent *event)
202 CSpiDeviceListener *clistener = (CSpiDeviceListener *) listener;
203 AccessibleDeviceEvent anevent;
204 gboolean handled = FALSE;
208 case Accessibility_KEY_PRESSED_EVENT:
209 anevent.type = SPI_KEY_PRESSED;
211 case Accessibility_KEY_RELEASED_EVENT:
212 anevent.type = SPI_KEY_RELEASED;
214 case Accessibility_BUTTON_PRESSED_EVENT:
215 anevent.type = SPI_BUTTON_PRESSED;
217 case Accessibility_BUTTON_RELEASED_EVENT:
218 anevent.type = SPI_BUTTON_RELEASED;
224 anevent.keyID = event->id;
225 anevent.keycode = event->hw_code;
226 anevent.timestamp = event->timestamp;
227 anevent.keystring = g_strdup (event->event_string);
228 anevent.modifiers = event->modifiers;
229 anevent.is_text = event->is_text;
231 /* FIXME: re-enterancy hazard on this list */
232 for (l = clistener->callbacks; l; l = l->next)
234 EventHandler *eh = l->data;
236 if ((handled = eh->cb.device_event (&anevent, eh->user_data)))
241 g_free (anevent.keystring);
247 cspi_device_listener_init (CSpiDeviceListener *listener)
252 cspi_device_listener_finalize (GObject *object)
254 CSpiDeviceListener *listener = (CSpiDeviceListener *) object;
257 for (l = listener->callbacks; l; l = l->next)
259 cspi_event_handler_free (l->data);
262 g_list_free (listener->callbacks);
264 device_parent_class->finalize (object);
268 cspi_device_listener_class_init (CSpiDeviceListenerClass *klass)
270 GObjectClass *object_class = (GObjectClass *) klass;
272 device_parent_class = g_type_class_peek_parent (klass);
273 object_class->finalize = cspi_device_listener_finalize;
275 klass->device_event = cspi_device_event;
278 BONOBO_TYPE_FUNC (CSpiDeviceListener,
279 spi_device_listener_get_type (),
280 cspi_device_listener)
283 cspi_device_listener_new (void)
285 CSpiEventListener *listener = g_object_new (cspi_device_listener_get_type (), NULL);
291 cspi_device_listener_add_cb (AccessibleDeviceListener *al,
292 AccessibleDeviceListenerCB callback,
295 CSpiDeviceListener *listener = al;
297 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
299 listener->callbacks = g_list_prepend (listener->callbacks,
300 cspi_event_handler_new ((void *)callback, user_data));
304 cspi_device_listener_remove_cb (AccessibleDeviceListener *al,
305 AccessibleDeviceListenerCB callback)
307 CSpiDeviceListener *listener = al;
309 g_return_if_fail (CSPI_IS_DEVICE_LISTENER (listener));
311 listener->callbacks = cspi_event_list_remove_by_cb (listener->callbacks, (void *) callback);
315 cspi_event_listener_unref (AccessibleEventListener *listener)
317 bonobo_object_unref (BONOBO_OBJECT (listener));
321 cspi_device_listener_unref (AccessibleDeviceListener *listener)
323 bonobo_object_unref (BONOBO_OBJECT (listener));
328 cspi_event_listener_get_corba (AccessibleEventListener *listener)
330 return BONOBO_OBJREF (listener);
334 cspi_device_listener_get_corba (AccessibleDeviceListener *listener)
336 return BONOBO_OBJREF (listener);