#endif
#include <bonobo/bonobo-exception.h>
+#include "../libspi/spi-private.h"
#include "registry.h"
/* Our parent GObject type */
EventTypeCategory event_type_cat;
} SpiListenerStruct;
-/* static function prototypes */
-static gboolean _device_event_controller_hook (gpointer source);
SpiListenerStruct *
spi_listener_struct_new (Accessibility_EventListener listener, CORBA_Environment *ev)
static void
+desktop_add_application (SpiDesktop *desktop,
+ guint index, gpointer data)
+{
+ BonoboObject *registry = BONOBO_OBJECT (data);
+ Accessibility_Event e;
+ CORBA_Environment ev;
+
+ e.type = g_strdup ("object:children-changed::add");
+ e.source = BONOBO_OBJREF (desktop);
+ e.detail1 = index;
+ e.detail2 = 0;
+ CORBA_exception_init (&ev);
+ Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
+ &e, &ev);
+ CORBA_exception_free (&ev);
+}
+
+
+
+static void
+desktop_remove_application (SpiDesktop *desktop,
+ guint index, gpointer data)
+{
+ BonoboObject *registry = BONOBO_OBJECT (data);
+ Accessibility_Event e;
+ CORBA_Environment ev;
+
+ e.type = g_strdup ("object:children-changed::remove");
+ e.source = BONOBO_OBJREF (desktop);
+ e.detail1 = index;
+ e.detail2 = 0;
+ CORBA_exception_init (&ev);
+ Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
+ &e, &ev);
+ CORBA_exception_free (&ev);
+}
+
+
+
+static void
spi_registry_object_finalize (GObject *object)
{
printf ("spi_registry_object_finalize called\n");
EventTypeStruct etype;
GList **list;
- fprintf(stderr, "registering for events of type %s\n", event_name);
+#ifdef SPI_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);
}
}
-static void
+static SpiReEntrantContinue
remove_listener_cb (GList * const *list, gpointer user_data)
{
SpiListenerStruct *ls = (SpiListenerStruct *) (*list)->data;
if (CORBA_Object_is_equivalent (ls->listener, listener, &ev))
{
- spi_re_enterant_list_delete_link (list);
+ spi_re_entrant_list_delete_link (list);
spi_listener_struct_free (ls, &ev);
}
CORBA_exception_free (&ev);
+
+ return SPI_RE_ENTRANT_CONTINUE;
}
/*
for (i = 0; i < sizeof (lists) / sizeof (lists[0]); i++)
{
- spi_re_enterant_list_foreach (lists [i], remove_listener_cb, listener);
+ spi_re_entrant_list_foreach (lists [i], remove_listener_cb, listener);
}
}
parse_event_type (&etype, (char *) event_name);
- spi_re_enterant_list_foreach (get_listener_list (registry, etype.type_cat),
- remove_listener_cb, listener);
+ spi_re_entrant_list_foreach (get_listener_list (registry, etype.type_cat),
+ remove_listener_cb, listener);
}
static Accessibility_DeviceEventController
impl_accessibility_registry_get_device_event_controller (PortableServer_Servant servant,
- CORBA_Environment *ev)
+ CORBA_Environment *ev)
{
SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
- if (!registry->device_event_controller)
+ if (!registry->de_controller)
{
- registry->device_event_controller = spi_device_event_controller_new (registry);
+ registry->de_controller = spi_device_event_controller_new (registry);
}
- return bonobo_object_dup_ref (BONOBO_OBJREF (registry->device_event_controller), ev);
+ return bonobo_object_dup_ref (BONOBO_OBJREF (registry->de_controller), ev);
}
typedef struct {
Accessibility_Event e_out;
} NotifyContext;
-static void
+static SpiReEntrantContinue
notify_listeners_cb (GList * const *list, gpointer user_data)
{
SpiListenerStruct *ls;
ctx->e_out.source = bonobo_object_dup_ref (ctx->source, ctx->ev);
if (BONOBO_EX (ctx->ev))
- return;
+ {
+ return SPI_RE_ENTRANT_CONTINUE;;
+ }
if ((*list) && (*list)->data == ls)
{
bonobo_object_release_unref (ctx->e_out.source, ctx->ev);
}
}
+
+ return SPI_RE_ENTRANT_CONTINUE;
}
static void
ctx.source = e->source;
parse_event_type (&ctx.etype, e->type);
- spi_re_enterant_list_foreach (list, notify_listeners_cb, &ctx);
+ spi_re_entrant_list_foreach (list, notify_listeners_cb, &ctx);
}
if (e->source != CORBA_OBJECT_NIL)
}
}
-static gboolean
-_device_event_controller_hook (gpointer p)
-{
- SpiRegistry *registry = (SpiRegistry *)p;
- SpiDeviceEventController *controller = registry->device_event_controller;
- if (controller)
- spi_device_event_controller_check_key_event (controller);
- return TRUE;
-}
static void
spi_registry_class_init (SpiRegistryClass *klass)
{
- GObjectClass * object_class = (GObjectClass *) klass;
- POA_Accessibility_Registry__epv *epv = &klass->epv;
-
- spi_registry_parent_class = g_type_class_ref (SPI_LISTENER_TYPE);
+ GObjectClass * object_class = (GObjectClass *) klass;
+ POA_Accessibility_Registry__epv *epv = &klass->epv;
- object_class->finalize = spi_registry_object_finalize;
-
- epv->registerApplication = impl_accessibility_registry_register_application;
- epv->deregisterApplication = impl_accessibility_registry_deregister_application;
- epv->registerGlobalEventListener = impl_accessibility_registry_register_global_event_listener;
- epv->deregisterGlobalEventListener = impl_accessibility_registry_deregister_global_event_listener;
- epv->deregisterGlobalEventListenerAll = impl_accessibility_registry_deregister_global_event_listener_all;
- epv->getDeviceEventController = impl_accessibility_registry_get_device_event_controller;
- epv->getDesktopCount = impl_accessibility_registry_get_desktop_count;
- epv->getDesktop = impl_accessibility_registry_get_desktop;
- epv->getDesktopList = impl_accessibility_registry_get_desktop_list;
+ spi_registry_parent_class = g_type_class_ref (SPI_LISTENER_TYPE);
+
+ object_class->finalize = spi_registry_object_finalize;
- ((SpiListenerClass *) klass)->epv.notifyEvent = impl_registry_notify_event;
+ klass->parent_class.epv.notifyEvent = impl_registry_notify_event;
+
+ epv->registerApplication = impl_accessibility_registry_register_application;
+ epv->deregisterApplication = impl_accessibility_registry_deregister_application;
+ epv->registerGlobalEventListener = impl_accessibility_registry_register_global_event_listener;
+ epv->deregisterGlobalEventListener = impl_accessibility_registry_deregister_global_event_listener;
+ epv->deregisterGlobalEventListenerAll = impl_accessibility_registry_deregister_global_event_listener_all;
+ epv->getDeviceEventController = impl_accessibility_registry_get_device_event_controller;
+ epv->getDesktopCount = impl_accessibility_registry_get_desktop_count;
+ epv->getDesktop = impl_accessibility_registry_get_desktop;
+ epv->getDesktopList = impl_accessibility_registry_get_desktop_list;
}
static void
registry->window_listeners = NULL;
registry->toolkit_listeners = NULL;
registry->desktop = spi_desktop_new ();
- registry->device_event_controller = NULL;
- registry->kbd_event_hook = _device_event_controller_hook;
+ /* Register callback notification for application addition and removal */
+ g_signal_connect (G_OBJECT (registry->desktop),
+ "application_added",
+ G_CALLBACK (desktop_add_application),
+ registry);
+
+ g_signal_connect (G_OBJECT (registry->desktop),
+ "application_removed",
+ G_CALLBACK (desktop_remove_application),
+ registry);
+
+ registry->de_controller = NULL;
}
BONOBO_TYPE_FUNC_FULL (SpiRegistry,
SpiRegistry *
spi_registry_new (void)
{
- SpiRegistry *retval = g_object_new (SPI_REGISTRY_TYPE, NULL);
- bonobo_object_set_immortal (BONOBO_OBJECT (retval), TRUE);
- return retval;
+ SpiRegistry *retval = g_object_new (SPI_REGISTRY_TYPE, NULL);
+ bonobo_object_set_immortal (BONOBO_OBJECT (retval), TRUE);
+ return retval;
}