-static GList **
-get_listener_list (SpiRegistry *registry,
- EventTypeCategory cat)
-{
- GList **ret;
-
- switch (cat)
- {
- case ETYPE_OBJECT:
- case ETYPE_PROPERTY:
- case ETYPE_FOCUS:
- case ETYPE_KEYBOARD:
- ret = ®istry->object_listeners;
- break;
- case ETYPE_WINDOW:
- ret = ®istry->window_listeners;
- break;
- case ETYPE_MOUSE:
- case ETYPE_TOOLKIT:
- ret = ®istry->toolkit_listeners;
- break;
- default:
- ret = NULL;
- break;
- }
- return ret;
-}
-
-/*
- * CORBA Accessibility::Registry::registerGlobalEventListener method implementation
- */
-static void
-impl_accessibility_registry_register_global_event_listener (
- PortableServer_Servant servant,
- Accessibility_EventListener listener,
- const CORBA_char *event_name,
- CORBA_Environment *ev)
-{
- SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
- SpiListenerStruct *ls = spi_listener_struct_new (listener, ev);
- EventTypeStruct etype;
- GList **list;
-
-#ifdef SPI_LISTENER_DEBUG
- fprintf (stderr, "registering for events of type %s\n", event_name);
-#endif
-
- /* parse, check major event type and add listener accordingly */
- parse_event_type (&etype, event_name);
- ls->event_type_quark = etype.minor;
- ls->event_type_cat = etype.type_cat;
-
- list = get_listener_list (registry, etype.type_cat);
-
- if (list)
- {
- *list = g_list_prepend (*list, ls);
-
- if (etype.type_cat == ETYPE_TOOLKIT)
- {
- register_with_toolkits (registry, &etype, ev);
- }
- }
- else
- {
- spi_listener_struct_free (ls, ev);
- }
-}
-
-static SpiReEntrantContinue
-remove_listener_cb (GList * const *list, gpointer user_data)
-{
- SpiListenerStruct *ls = (SpiListenerStruct *) (*list)->data;
- CORBA_Environment ev;
- Accessibility_EventListener listener = user_data;
-
- CORBA_exception_init (&ev);
-
- if (CORBA_Object_is_equivalent (ls->listener, listener, &ev))
- {
- spi_re_entrant_list_delete_link (list);
- spi_listener_struct_free (ls, &ev);
- }
-
- CORBA_exception_free (&ev);
-
- return SPI_RE_ENTRANT_CONTINUE;
-}
-
-/*
- * CORBA Accessibility::Registry::deregisterGlobalEventListenerAll method implementation
- */
-static void
-impl_accessibility_registry_deregister_global_event_listener_all (
- PortableServer_Servant servant,
- Accessibility_EventListener listener,
- CORBA_Environment *ev)
-{
- int i;
- GList **lists[3];
- SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
-
- lists[0] = ®istry->object_listeners;
- lists[1] = ®istry->window_listeners;
- lists[2] = ®istry->toolkit_listeners;
-
- for (i = 0; i < sizeof (lists) / sizeof (lists[0]); i++)
- {
- spi_re_entrant_list_foreach (lists [i], remove_listener_cb, listener);
- }
-}
-
-
-/*
- * CORBA Accessibility::Registry::deregisterGlobalEventListener method implementation
- */
-static void
-impl_accessibility_registry_deregister_global_event_listener (
- PortableServer_Servant servant,
- Accessibility_EventListener listener,
- const CORBA_char *event_name,
- CORBA_Environment *ev)
-{
- SpiRegistry *registry;
- EventTypeStruct etype;
-
- registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
-
- parse_event_type (&etype, (char *) event_name);
-
- spi_re_entrant_list_foreach (get_listener_list (registry, etype.type_cat),
- remove_listener_cb, listener);
-}
-
-