X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=blobdiff_plain;f=registryd%2Fregistry.c;h=51aaa4d3cb7e7f10560073a5bf6eef96267e501d;hp=655ca31d0da7732c99ff30738de878ac266deda3;hb=95ac4886d1b6649d54daffa7191be1b2bbaf2989;hpb=458d7fdef6a1c70360c6a61f1549f4bb65a9bbdc diff --git a/registryd/registry.c b/registryd/registry.c index 655ca31..51aaa4d 100644 --- a/registryd/registry.c +++ b/registryd/registry.c @@ -2,6 +2,7 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * + * Copyright 2008, Codethink Ltd. * Copyright 2001, 2002 Sun Microsystems Inc., * Copyright 2001, 2002 Ximian, Inc. * @@ -21,671 +22,263 @@ * Boston, MA 02111-1307, USA. */ -/* registry.c: the main accessibility service registry implementation */ - -#undef SPI_LISTENER_DEBUG -#undef SPI_DEBUG - #include -#ifdef SPI_DEBUG -# include -#endif +#include +#include -#include -#include "../libspi/spi-private.h" #include "registry.h" -/* Our parent GObject type */ -#define PARENT_TYPE SPI_LISTENER_TYPE - -/* A pointer to our parent object class */ -static SpiListenerClass *spi_registry_parent_class; - -typedef enum { - ETYPE_FOCUS, - ETYPE_OBJECT, - ETYPE_PROPERTY, - ETYPE_WINDOW, - ETYPE_TOOLKIT, - ETYPE_KEYBOARD, - ETYPE_MOUSE, - ETYPE_LAST_DEFINED -} EventTypeCategory; - -typedef struct { - const char *event_name; - EventTypeCategory type_cat; - GQuark major; /* from string segment[1] */ - GQuark minor; /* from string segment[1]+segment[2] */ - GQuark detail; /* from string segment[3] (not concatenated) */ -} EventTypeStruct; - -typedef struct { - Accessibility_EventListener listener; - GQuark event_type_quark; - EventTypeCategory event_type_cat; -} SpiListenerStruct; - -SpiListenerStruct * -spi_listener_struct_new (Accessibility_EventListener listener, CORBA_Environment *ev) +enum { - SpiListenerStruct *retval = g_malloc (sizeof (SpiListenerStruct)); - retval->listener = bonobo_object_dup_ref (listener, ev); - return retval; -} + REGISTRY_APPLICATION_REMOVE = 0, + REGISTRY_APPLICATION_ADD = 1 +}; +/*---------------------------------------------------------------------------*/ -void -spi_listener_struct_free (SpiListenerStruct *ls, CORBA_Environment *ev) -{ - bonobo_object_release_unref (ls->listener, ev); - g_free (ls); -} +G_DEFINE_TYPE(SpiRegistry, spi_registry, G_TYPE_OBJECT) static void -desktop_add_application (SpiDesktop *desktop, - guint index, gpointer data) +spi_registry_class_init (SpiRegistryClass *klass) { - BonoboObject *registry = BONOBO_OBJECT (data); - Accessibility_Event e; - CORBA_Environment ev; - - e.type = "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); - Accessibility_Desktop_unref (e.source, &ev); - CORBA_exception_free (&ev); -} - - + GObjectClass * object_class = (GObjectClass *) klass; -static void -desktop_remove_application (SpiDesktop *desktop, - guint index, gpointer data) -{ - BonoboObject *registry = BONOBO_OBJECT (data); - Accessibility_Event e; - CORBA_Environment ev; - - e.type = "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); - Accessibility_Desktop_unref (e.source, &ev); - CORBA_exception_free (&ev); + spi_registry_parent_class = g_type_class_ref (G_TYPE_OBJECT); } - static void -spi_registry_object_finalize (GObject *object) +spi_registry_init (SpiRegistry *registry) { - printf ("spi_registry_object_finalize called\n"); - - /* TODO: unref deviceeventcontroller, which disconnects key listener */ - G_OBJECT_CLASS (spi_registry_parent_class)->finalize (object); + registry->apps = g_sequence_new (g_free); } -static long -_get_unique_id (void) -{ - static long id = 0; - - return ++id; -} +/*---------------------------------------------------------------------------*/ -/** - * registerApplication: - * @application: a reference to the requesting @Application - * return values: void - * - * Register a new application with the accessibility broker. - * - **/ -static void -impl_accessibility_registry_register_application (PortableServer_Servant servant, - const Accessibility_Application application, - CORBA_Environment * ev) +static void emit(SpiRegistry *reg, const char *itf, const char *name, int ftype, ...) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - -#ifdef SPI_DEBUG - fprintf (stderr, "registering app %p\n", application); -#endif - spi_desktop_add_application (registry->desktop, application); - - Accessibility_Application__set_id (application, _get_unique_id (), ev); + va_list arg; - /* - * TODO: change the implementation below to a WM-aware one; - * e.g. don't add all apps to the SpiDesktop - */ -} - -#ifdef USE_A_HASH_IN_FUTURE -static gint -compare_corba_objects (gconstpointer p1, gconstpointer p2) -{ - CORBA_Environment ev; - gint retval; - -#ifdef SPI_DEBUG - fprintf (stderr, "comparing %p to %p\n", - p1, p2); -#endif - - retval = !CORBA_Object_is_equivalent ((CORBA_Object) p1, (CORBA_Object) p2, &ev); - return retval; + va_start(arg, ftype); + spi_dbus_emit_valist(reg->bus, SPI_DBUS_PATH_DEC, itf, name, ftype, arg); + va_end(arg); } -#endif -static void -register_with_toolkits (SpiRegistry *spi_registry_bonobo_object, EventTypeStruct *etype, CORBA_Environment *ev) -{ - gint n_desktops; - gint n_apps; - gint i, j; - Accessibility_Desktop desktop; - Accessibility_Application app; - Accessibility_Registry registry; - registry = BONOBO_OBJREF (spi_registry_bonobo_object); - - /* for each app in each desktop, call ...Application_registerToolkitEventListener */ - - n_desktops = Accessibility_Registry_getDesktopCount (registry, ev); - - for (i=0; ievent_name), - ev); - } - } -} - -#ifdef USE_A_HASH_IN_FUTURE +/*---------------------------------------------------------------------------*/ static gint -compare_listener_quarks (gconstpointer p1, gconstpointer p2) +data_str_cmp (gpointer a, gpointer b, gpointer data) { - return (((SpiListenerStruct *)p2)->event_type_quark != - ((SpiListenerStruct *)p1)->event_type_quark); + return g_strcmp0(a, b); } -static gint -compare_listener_corbaref (gconstpointer p1, gconstpointer p2) +static gboolean +seq_add_string (GSequence *seq, gchar *str) { - return compare_corba_objects (((SpiListenerStruct *)p2)->listener, - ((SpiListenerStruct *)p1)->listener); -} -#endif + GSequenceIter *iter; + gchar *item; + gboolean res = FALSE; -static void -parse_event_type (EventTypeStruct *etype, const char *event_name) -{ - gchar **split_string; - gchar *s; - - split_string = g_strsplit (event_name, ":", 4); - etype->event_name = event_name; + iter = g_sequence_search (seq, str, (GCompareDataFunc) data_str_cmp, NULL); + iter = g_sequence_iter_prev (iter); - if (!g_ascii_strncasecmp (event_name, "focus:", 6)) - { - etype->type_cat = ETYPE_FOCUS; - } - else if (!g_ascii_strncasecmp (event_name, "mouse:", 6)) + if (!g_sequence_iter_is_end (iter)) { - etype->type_cat = ETYPE_MOUSE; - } - else if (!g_ascii_strncasecmp (event_name, "object:", 7)) - { - etype->type_cat = ETYPE_OBJECT; - } - else if (!g_ascii_strncasecmp (event_name, "window:", 7)) - { - etype->type_cat = ETYPE_WINDOW; - } - else - { - etype->type_cat = ETYPE_TOOLKIT; - } - - if (split_string[1]) - { - etype->major = g_quark_from_string (split_string[1]); - if (split_string[2]) - { - etype->minor = g_quark_from_string (s = g_strconcat (split_string[1], split_string[2], NULL)); - g_free (s); - if (split_string[3]) - { - etype->detail = g_quark_from_string (split_string[3]); - } - else - { - etype->detail = g_quark_from_static_string (""); - } - } - else + item = g_sequence_get (iter); + if (g_strcmp0 (item, str)) { - etype->minor = etype->major; - etype->detail = g_quark_from_static_string (""); //etype->major; + g_sequence_insert_sorted (seq, g_strdup(str), (GCompareDataFunc) data_str_cmp, NULL); + res = TRUE; } } else { - etype->major = g_quark_from_static_string (""); - etype->minor = etype->major; - etype->detail = etype->major; + g_sequence_insert_sorted (seq, g_strdup(str), (GCompareDataFunc) data_str_cmp, NULL); + res = TRUE; } - g_strfreev (split_string); + return res; } -/** - * deregisterApplication: - * @application: a reference to the @Application - * to be deregistered. - * return values: void - * - * De-register an application previously registered with the broker. - * - **/ -static void -impl_accessibility_registry_deregister_application (PortableServer_Servant servant, - const Accessibility_Application application, - CORBA_Environment * ev) +static gboolean +seq_remove_string (GSequence *seq, gchar *str) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - - spi_desktop_remove_application (registry->desktop, application); + GSequenceIter *iter; + gchar *item; + gboolean res = FALSE; -#ifdef SPI_DEBUG - fprintf (stderr, "de-registered app %p\n", application); -#endif -} + iter = g_sequence_search (seq, str, (GCompareDataFunc) data_str_cmp, NULL); + iter = g_sequence_iter_prev (iter); -static GList ** -get_listener_list (SpiRegistry *registry, - EventTypeCategory cat) -{ - GList **ret; - - switch (cat) + if (!g_sequence_iter_is_end (iter)) { - case ETYPE_OBJECT: - case ETYPE_PROPERTY: - case ETYPE_FOCUS: - ret = ®istry->object_listeners; - break; - case ETYPE_WINDOW: - ret = ®istry->window_listeners; - break; - case ETYPE_MOUSE: - case ETYPE_TOOLKIT: - ret = ®istry->toolkit_listeners; - break; - case ETYPE_KEYBOARD: - 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"); - 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) + item = g_sequence_get (iter); + if (!g_strcmp0 (item, str)) { - register_with_toolkits (registry, &etype, ev); - } - } - else - { - spi_listener_struct_free (ls, ev); + g_sequence_remove (iter); + res = TRUE; + } } + return res; } -static SpiReEntrantContinue -remove_listener_cb (GList * const *list, gpointer user_data) +static void +add_application (DBusConnection *bus, SpiRegistry *reg, gchar *app) { - SpiListenerStruct *ls = (SpiListenerStruct *) (*list)->data; - CORBA_Environment ev; - Accessibility_EventListener listener = user_data; + guint add = REGISTRY_APPLICATION_ADD; - CORBA_exception_init (&ev); - - if (CORBA_Object_is_equivalent (ls->listener, listener, &ev)) + if (seq_add_string (reg->apps, app)) { - spi_re_entrant_list_delete_link (list); - spi_listener_struct_free (ls, &ev); + emit (reg, + SPI_DBUS_INTERFACE_REGISTRY, + "updateApplications", + DBUS_TYPE_INT32, + &add, + DBUS_TYPE_STRING, + &app, + DBUS_TYPE_INVALID); } - - 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) +remove_application (DBusConnection *bus, SpiRegistry *reg, gchar *app) { - int i; - GList **lists[2]; - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); + guint remove = REGISTRY_APPLICATION_REMOVE; - 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++) + if (seq_remove_string (reg->apps, app)) { - spi_re_entrant_list_foreach (lists [i], remove_listener_cb, listener); + /*TODO spi_remove_device_listeners (registry->de_controller, old);*/ + emit (reg, + SPI_DBUS_INTERFACE_REGISTRY, + "updateApplications", + DBUS_TYPE_INT32, + &remove, + DBUS_TYPE_STRING, + &app, + DBUS_TYPE_INVALID); } } +/*---------------------------------------------------------------------------*/ -/* - * 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) +add_bus_name_cb (gpointer item, gpointer data) { - SpiRegistry *registry; - EventTypeStruct etype; - - registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); + DBusMessageIter *iter_array = (DBusMessageIter *) data; - parse_event_type (&etype, (char *) event_name); - - spi_re_entrant_list_foreach (get_listener_list (registry, etype.type_cat), - remove_listener_cb, listener); + dbus_message_iter_append_basic (iter_array, DBUS_TYPE_STRING, (gchar **) &item); } - -/** - * getDesktopCount: - * return values: a short integer indicating the current number of - * @Desktops. - * - * Get the current number of desktops. - * - **/ -static short -impl_accessibility_registry_get_desktop_count (PortableServer_Servant servant, - CORBA_Environment * ev) +static DBusMessage * +impl_getApplications (DBusConnection *bus, DBusMessage *message, void *user_data) { - /* TODO: implement support for multiple virtual desktops */ - CORBA_short n_desktops; - n_desktops = (CORBA_short) 1; - return n_desktops; + DBusMessage *reply; + DBusMessageIter iter, iter_array; + SpiRegistry *reg = SPI_REGISTRY (user_data); + + reply = dbus_message_new_method_return (message); + + dbus_message_iter_init_append (reply, &iter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &iter_array); + g_sequence_foreach (reg->apps, add_bus_name_cb, &iter_array); + dbus_message_iter_close_container(&iter, &iter_array); + return reply; } +/*---------------------------------------------------------------------------*/ -/** - * getDesktop: - * @n: the index of the requested @Desktop. - * return values: a reference to the requested @Desktop. - * - * Get the nth accessible desktop. - * - **/ -static Accessibility_Desktop -impl_accessibility_registry_get_desktop (PortableServer_Servant servant, - const CORBA_short n, - CORBA_Environment * ev) +static void +impl_registerApplication (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); + gchar *app_name; + SpiRegistry *reg = SPI_REGISTRY (user_data); - /* TODO: implement support for multiple virtual desktops */ - if (n == 0) - { - return (Accessibility_Desktop) - bonobo_object_dup_ref (BONOBO_OBJREF (registry->desktop), ev); - } - else - { - return (Accessibility_Desktop) CORBA_OBJECT_NIL; - } + if (dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &app_name, DBUS_TYPE_INVALID)) + add_application(bus, reg, app_name); } - -/** - * getDesktopList: - * return values: a sequence containing references to - * the @Desktops. - * - * Get a list of accessible desktops. - * - **/ -static Accessibility_DesktopSeq * -impl_accessibility_registry_get_desktop_list (PortableServer_Servant servant, - CORBA_Environment * ev) +static void +impl_deregisterApplication (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - Accessibility_DesktopSeq *desktops; - - desktops = Accessibility_DesktopSeq__alloc (); - desktops->_length = desktops->_maximum = 1; - desktops->_buffer = Accessibility_DesktopSeq_allocbuf (desktops->_length); - desktops->_buffer [0] = bonobo_object_dup_ref (BONOBO_OBJREF (registry->desktop), ev); + gchar *app_name; + SpiRegistry *reg = SPI_REGISTRY (user_data); - return desktops; + if (dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &app_name, DBUS_TYPE_INVALID)) + remove_application(bus, reg, app_name); } +/*---------------------------------------------------------------------------*/ -static Accessibility_DeviceEventController -impl_accessibility_registry_get_device_event_controller (PortableServer_Servant servant, - CORBA_Environment *ev) +static void +handle_disconnection (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - - if (!registry->de_controller) + char *name, *old, *new; + SpiRegistry *reg = SPI_REGISTRY (user_data); + + if (dbus_message_get_args (message, NULL, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old, + DBUS_TYPE_STRING, &new, + DBUS_TYPE_INVALID)) { - registry->de_controller = spi_device_event_controller_new (registry); + if (*old != '\0' && *new == '\0') + { + remove_application(bus, reg, old); + } } - - return bonobo_object_dup_ref (BONOBO_OBJREF (registry->de_controller), ev); } -typedef struct { - CORBA_Environment *ev; - Bonobo_Unknown source; - EventTypeStruct etype; - Accessibility_Event e_out; -} NotifyContext; +/*---------------------------------------------------------------------------*/ -static SpiReEntrantContinue -notify_listeners_cb (GList * const *list, gpointer user_data) +static DBusHandlerResult +signal_filter (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiListenerStruct *ls; - NotifyContext *ctx = user_data; -#ifdef SPI_DEBUG - CORBA_string s; -#endif - - ls = (*list)->data; - -#ifdef SPI_LISTENER_DEBUG - fprintf (stderr, "event quarks: %lx %lx %lx\n", ls->event_type_quark, ctx->etype.major, ctx->etype.minor); - fprintf (stderr, "event name: %s\n", ctx->etype.event_name); -#endif + SpiRegistry *registry = SPI_REGISTRY (user_data); + guint res = DBUS_HANDLER_RESULT_HANDLED; + const char *iface = dbus_message_get_interface (message); + const char *member = dbus_message_get_member (message); - if ((ls->event_type_quark == ctx->etype.major) || - (ls->event_type_quark == ctx->etype.minor)) - { -#ifdef SPI_DEBUG - fprintf (stderr, "notifying listener %d\n", 0); -/* g_list_index (list, l->data)); */ - s = Accessibility_Accessible__get_name (ctx->source, ctx->ev); - fprintf (stderr, "event source name %s\n", s); - CORBA_free (s); -#endif - - ctx->e_out.source = CORBA_Object_duplicate (ctx->source, ctx->ev); - - if (BONOBO_EX (ctx->ev)) - { - return SPI_RE_ENTRANT_CONTINUE; - } - - if ((*list) && (*list)->data == ls) - { - Accessibility_EventListener_notifyEvent ( - (Accessibility_EventListener) ls->listener, &ctx->e_out, ctx->ev); - if (ctx->ev->_major != CORBA_NO_EXCEPTION) - { - g_warning ("Accessibility app error: exception during " - "event notification: %s\n", - CORBA_exception_id (ctx->ev)); - if (ctx->ev->_major == CORBA_SYSTEM_EXCEPTION) - CORBA_exception_init (ctx->ev); - /* clear system exception on notify, it means listener is dead but - * that's no concern of the event source :-) */ - } - } - else /* dup re-entered */ - { - CORBA_Object_release (ctx->e_out.source, ctx->ev); - } - } + if (!g_strcmp0(iface, DBUS_INTERFACE_DBUS) && !g_strcmp0(member, "NameOwnerChanged")) + handle_disconnection (bus, message, user_data); + else + res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - return SPI_RE_ENTRANT_CONTINUE; + return res; } -static void -impl_registry_notify_event (PortableServer_Servant servant, - const Accessibility_Event *e, - CORBA_Environment *ev) -{ - SpiRegistry *registry; - GList **list; - NotifyContext ctx; +/*---------------------------------------------------------------------------*/ - registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); +static gchar *app_sig_match_name_owner = + "type='signal', interface='org.freedesktop.DBus', member='NameOwnerChanged'"; - parse_event_type (&ctx.etype, e->type); - - list = get_listener_list (registry, ctx.etype.type_cat); +static DRouteMethod dev_methods[] = +{ + { impl_getApplications, "getApplications" }, + { impl_registerApplication, "registerApplication" }, + { impl_deregisterApplication, "deregisterApplication" }, + { NULL, NULL } +}; - if (list) - { - ctx.ev = ev; - ctx.e_out = *e; - ctx.source = e->source; - parse_event_type (&ctx.etype, e->type); +SpiRegistry * +spi_registry_new (DBusConnection *bus, DRouteContext *droute) +{ + SpiRegistry *reg = g_object_new (SPI_REGISTRY_TYPE, NULL); + DRoutePath *path; - spi_re_entrant_list_foreach (list, notify_listeners_cb, &ctx); - } + reg->bus = bus; -} + dbus_bus_add_match (bus, app_sig_match_name_owner, NULL); + dbus_connection_add_filter (bus, signal_filter, reg, NULL); + path = droute_add_one (droute, + SPI_DBUS_PATH_REGISTRY, + reg); -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); - - object_class->finalize = spi_registry_object_finalize; - - 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; -} + droute_path_add_interface (path, + SPI_DBUS_INTERFACE_DEC, + dev_methods, + NULL); -static void -spi_registry_init (SpiRegistry *registry) -{ - registry->object_listeners = NULL; - registry->window_listeners = NULL; - registry->toolkit_listeners = NULL; - registry->desktop = spi_desktop_new (); - /* 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 = spi_device_event_controller_new (registry); + return reg; } -BONOBO_TYPE_FUNC_FULL (SpiRegistry, - Accessibility_Registry, - PARENT_TYPE, - spi_registry); - -SpiRegistry * -spi_registry_new (void) -{ - SpiRegistry *retval = g_object_new (SPI_REGISTRY_TYPE, NULL); - bonobo_object_set_immortal (BONOBO_OBJECT (retval), TRUE); - return retval; -} +/*END------------------------------------------------------------------------*/