X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Fregistry.c;h=f2fabf59d924b6085ef5c7e23e8bd1860281677a;hb=64d2ef34df02b4f5fb70da553d87674f67e779a8;hp=957be220c0559517414ceefc178b367830254c82;hpb=66c4375c7cd9a0a01e79f562e1bb0326fc4dcd21;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/registry.c b/libspi/registry.c index 957be22..f2fabf5 100644 --- a/libspi/registry.c +++ b/libspi/registry.c @@ -20,42 +20,19 @@ * Boston, MA 02111-1307, USA. */ -/* - * registry.c: the main accessibility service registry implementation - */ +/* registry.c: the main accessibility service registry implementation */ +#include #ifdef SPI_DEBUG -#include +# include #endif -#include -#include -/* - * This pulls the CORBA definitions for the "Accessibility::Registry" server - */ -#include +#include -/* - * We'd like to replace the dependance on X-isms with a wrapper layer, - * to the extent that it can't be done with pure GDK. - * Anyone want to help? - */ -#include -#include - -/* - * This pulls the definition for the BonoboObject (GType) - */ -#include "registry.h" - -/* - * Our parent GObject type - */ +/* Our parent GObject type */ #define PARENT_TYPE SPI_LISTENER_TYPE -/* - * A pointer to our parent object class - */ +/* A pointer to our parent object class */ static SpiListenerClass *spi_registry_parent_class; typedef enum { @@ -64,6 +41,8 @@ typedef enum { ETYPE_PROPERTY, ETYPE_WINDOW, ETYPE_TOOLKIT, + ETYPE_KEYBOARD, + ETYPE_LAST_DEFINED } EventTypeCategory; @@ -83,7 +62,7 @@ typedef struct { } SpiListenerStruct; /* static function prototypes */ -static void _registry_notify_listeners ( GList *listeners, +static void _registry_notify_listeners (GList *listeners, const Accessibility_Event *e, CORBA_Environment *ev); @@ -91,18 +70,30 @@ static long _get_unique_id(); static gboolean _device_event_controller_hook (gpointer source); -/* - * Implemented GObject::finalize - */ +SpiListenerStruct * +spi_listener_struct_new (Accessibility_EventListener listener, CORBA_Environment *ev) +{ + SpiListenerStruct *retval = g_malloc (sizeof (SpiListenerStruct)); + retval->listener = bonobo_object_dup_ref (listener, ev); + return retval; +} + +void +spi_listener_struct_free (SpiListenerStruct *ls, CORBA_Environment *ev) +{ + bonobo_object_release_unref (ls->listener, ev); + g_free (ls); +} + +/* GObject::finalize */ static void spi_registry_object_finalize (GObject *object) { -/* SpiRegistry *registry = SPI_REGISTRY (object); */ - GObjectClass *object_class = G_OBJECT_GET_CLASS( object); + SpiRegistry *registry = SPI_REGISTRY (object); printf("spi_registry_object_finalize called\n"); - - object_class->finalize (object); + /* TODO: unref deviceeventcontroller, which disconnects key listener */ + G_OBJECT_CLASS (spi_registry_parent_class)->finalize (object); } /** @@ -123,10 +114,8 @@ impl_accessibility_registry_register_application (PortableServer_Servant servant #ifdef SPI_DEBUG fprintf (stderr, "registering app %p\n", application); #endif - registry->desktop->applications = g_list_append (registry->desktop->applications, - bonobo_object_dup_ref (application, ev)); + spi_desktop_add_application (registry->desktop, application); - /* TODO: create unique string here (with libuuid call ?) and hash ? */ Accessibility_Application__set_id (application, _get_unique_id(), ev); /* @@ -199,8 +188,8 @@ compare_listener_corbaref (gconstpointer p1, gconstpointer p2) static void parse_event_type (EventTypeStruct *etype, char *event_name) { - guint nbytes = 0; gchar **split_string; + gchar *s; split_string = g_strsplit(event_name, ":", 4); etype->event_name = g_strndup(event_name, 255); @@ -224,19 +213,23 @@ parse_event_type (EventTypeStruct *etype, char *event_name) if (split_string[1]) { - etype->major = split_string[1]; + etype->major = g_strdup (split_string[1]); if (split_string[2]) { - etype->minor = split_string[2]; + etype->minor = g_strdup (split_string[2]); if (split_string[3]) { - etype->detail = split_string[3]; - etype->hash = g_str_hash ( g_strconcat (split_string[1], split_string[2], split_string[3], NULL)); + etype->detail = g_strdup (split_string[3]); + s = g_strconcat (split_string[1], split_string[2], split_string[3], NULL); + etype->hash = g_str_hash (s); + g_free (s); } else { etype->detail = g_strdup (""); - etype->hash = g_str_hash ( g_strconcat (split_string[1], split_string[2], NULL)); + s = g_strconcat (split_string[1], split_string[2], NULL); + etype->hash = g_str_hash (s); + g_free (s); } } else @@ -253,7 +246,7 @@ parse_event_type (EventTypeStruct *etype, char *event_name) etype->hash = g_str_hash (""); } - /* TODO: don't forget to free the strings from caller when done ! */ + g_strfreev (split_string); } /** @@ -271,29 +264,12 @@ impl_accessibility_registry_deregister_application (PortableServer_Servant serva CORBA_Environment * ev) { SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - GList *list = g_list_find_custom (registry->desktop->applications, &application, compare_corba_objects); -#ifdef SPI_DEBUG - gint i; -#endif + spi_desktop_remove_application (registry->desktop, application); - if (list) - { #ifdef SPI_DEBUG - fprintf (stderr, "deregistering application %p\n", application); + fprintf (stderr, "de-registered app %p\n", application); #endif - registry->desktop->applications = g_list_delete_link (registry->desktop->applications, list); -#ifdef SPI_DEBUG - fprintf (stderr, "there are now %d apps registered.\n", g_list_length (registry->desktop->applications)); - for (i = 0; i < g_list_length (registry->desktop->applications); ++i) { - fprintf (stderr, "getting application %d\n", i); - fprintf (stderr, "object address %p\n", - g_list_nth_data (registry->desktop->applications, i)); - } -#endif - } - else - fprintf (stderr, "could not deregister application\n"); } /* @@ -307,14 +283,13 @@ impl_accessibility_registry_register_global_event_listener ( CORBA_Environment *ev) { SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - SpiListenerStruct *ls = g_malloc (sizeof (SpiListenerStruct)); + SpiListenerStruct *ls = spi_listener_struct_new (listener, ev); EventTypeStruct etype; - gboolean is_toolkit_specific = TRUE; fprintf(stderr, "registering for events of type %s\n", event_name); /* parse, check major event type and add listener accordingly */ - parse_event_type (&etype, event_name); + parse_event_type (&etype, (char*) event_name); ls->event_type_hash = etype.hash; ls->event_type_cat = etype.type_cat; @@ -323,20 +298,20 @@ impl_accessibility_registry_register_global_event_listener ( case (ETYPE_FOCUS) : case (ETYPE_OBJECT) : case (ETYPE_PROPERTY) : - ls->listener = CORBA_Object_duplicate (listener, ev); registry->object_listeners = g_list_append (registry->object_listeners, ls); break; case (ETYPE_WINDOW) : /* Support for Window Manager Events is not yet implemented */ + spi_listener_struct_free (ls, ev); break; case (ETYPE_TOOLKIT) : - ls->listener = CORBA_Object_duplicate (listener, ev); registry->toolkit_listeners = g_list_append (registry->toolkit_listeners, ls); register_with_toolkits (registry, &etype, ev); break; default: + spi_listener_struct_free (ls, ev); break; } } @@ -351,9 +326,8 @@ impl_accessibility_registry_deregister_global_event_listener_all ( CORBA_Environment *ev) { SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - SpiListenerStruct *ls = g_malloc (sizeof (SpiListenerStruct)); + SpiListenerStruct *ls = spi_listener_struct_new (listener, ev); GList *list; - ls->listener = listener; list = g_list_find_custom (registry->object_listeners, ls, compare_listener_corbaref); @@ -364,17 +338,18 @@ impl_accessibility_registry_deregister_global_event_listener_all ( while (list) { - fprintf (stderr, "deregistering listener\n"); + spi_listener_struct_free ((SpiListenerStruct *) list->data, ev); registry->object_listeners = g_list_delete_link (registry->object_listeners, list); list = g_list_find_custom (registry->object_listeners, ls, compare_listener_corbaref); } list = g_list_find_custom (registry->toolkit_listeners, ls, compare_listener_corbaref); while (list) { - fprintf (stderr, "deregistering listener\n"); + spi_listener_struct_free ((SpiListenerStruct *) list->data, ev); registry->toolkit_listeners = g_list_delete_link (registry->toolkit_listeners, list); list = g_list_find_custom (registry->toolkit_listeners, ls, compare_listener_corbaref); } + spi_listener_struct_free (ls, ev); } /* @@ -393,7 +368,7 @@ impl_accessibility_registry_deregister_global_event_listener ( GList *list; GList **listeners; - parse_event_type (&etype, event_name); + parse_event_type (&etype, (char *) event_name); switch (etype.type_cat) { case (ETYPE_OBJECT) : @@ -403,20 +378,25 @@ impl_accessibility_registry_deregister_global_event_listener ( break; case (ETYPE_WINDOW) : /* Support for Window Manager Events is not yet implemented */ + listeners = NULL; break; case (ETYPE_TOOLKIT) : listeners = ®istry->toolkit_listeners; break; default: + listeners = NULL; break; } + if (!listeners) + return; + ls.event_type_hash = etype.hash; list = g_list_find_custom (*listeners, &ls, compare_listener_hash); while (list) { - fprintf (stderr, "deregistering listener\n"); + spi_listener_struct_free ((SpiListenerStruct *) list->data, ev); *listeners = g_list_delete_link (*listeners, list); list = g_list_find_custom (*listeners, &ls, compare_listener_hash); } @@ -460,7 +440,7 @@ impl_accessibility_registry_get_desktop (PortableServer_Servant servant, if (n == 0) { return (Accessibility_Desktop) - CORBA_Object_duplicate (BONOBO_OBJREF (registry->desktop), ev); + bonobo_object_dup_ref (BONOBO_OBJREF (registry->desktop), ev); } else { @@ -490,8 +470,9 @@ impl_accessibility_registry_get_device_event_controller (PortableServer_Servant { SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); if (!registry->device_event_controller) - registry->device_event_controller = g_object_new (SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL); - return CORBA_Object_duplicate (BONOBO_OBJREF (registry->device_event_controller), ev); + registry->device_event_controller = spi_device_event_controller_new (registry); + + return bonobo_object_dup_ref (BONOBO_OBJREF (registry->device_event_controller), ev); } static void @@ -517,10 +498,14 @@ impl_registry_notify_event (PortableServer_Servant servant, case (ETYPE_TOOLKIT) : _registry_notify_listeners (registry->toolkit_listeners, e, ev); break; + case (ETYPE_KEYBOARD) : default: break; } - /* Accessibility_Accessible_unref (e->source, ev);*/ /* This should be here! */ + if (e->source != CORBA_OBJECT_NIL) + { + Accessibility_Accessible_unref (e->source, ev); + } } static long @@ -530,49 +515,59 @@ _get_unique_id () return ++id; } +#define SPI_DEBUG + static void -_registry_notify_listeners ( GList *listeners, - const Accessibility_Event *e, +_registry_notify_listeners (GList *listeners, + const Accessibility_Event *e_in, CORBA_Environment *ev) { - int n; - int len; - SpiListenerStruct *ls; - EventTypeStruct etype; - guint minor_hash; - parse_event_type (&etype, e->type); - minor_hash = g_str_hash (g_strconcat (etype.major, etype.minor, NULL)); - len = g_list_length (listeners); + GList *l; + Accessibility_Event e_out; + SpiListenerStruct *ls; + EventTypeStruct etype; + guint minor_hash; + CORBA_string s; - for (n=0; ntype); + + s = g_strconcat (etype.major, etype.minor, NULL); + minor_hash = g_str_hash (s); + g_free (s); + + for (l = listeners; l; l = l->next) { - ls = (SpiListenerStruct *) g_list_nth_data (listeners, n); + ls = (SpiListenerStruct *) l->data; + #ifdef SPI_SPI_LISTENER_DEBUG - fprintf(stderr, "event hashes: %lx %lx %lx\n", ls->event_type_hash, etype.hash, minor_hash); - fprintf(stderr, "event name: %s\n", etype.event_name); + fprintf (stderr, "event hashes: %lx %lx %lx\n", ls->event_type_hash, etype.hash, minor_hash); + fprintf (stderr, "event name: %s\n", etype.event_name); #endif + if ((ls->event_type_hash == etype.hash) || (ls->event_type_hash == minor_hash)) { #ifdef SPI_DEBUG - fprintf(stderr, "notifying listener #%d\n", n); - fprintf(stderr, "event source name %s\n", Accessibility_Accessible__get_name(e->source, ev)); + fprintf (stderr, "notifying listener %d\n", g_list_index (listeners, l->data)); + s = Accessibility_Accessible__get_name (e_in->source, ev); + fprintf (stderr, "event source name %s\n", s); + CORBA_free (s); #endif - e->source = CORBA_Object_duplicate (e->source, ev); - Accessibility_Accessible_ref ( e->source, ev); + e_out.source = bonobo_object_dup_ref (e_in->source, ev); Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener, - e, + &e_out, ev); - if (ev->_major != CORBA_NO_EXCEPTION) { - fprintf(stderr, - ("Accessibility app error: exception during event notification: %s\n"), - CORBA_exception_id(ev)); - exit(-1); - } + if (ev->_major != CORBA_NO_EXCEPTION) + { + g_error ("Accessibility app error: exception during event notification: %s\n", + CORBA_exception_id (ev)); + } } } } -static gboolean _device_event_controller_hook (gpointer p) +static gboolean +_device_event_controller_hook (gpointer p) { SpiRegistry *registry = (SpiRegistry *)p; SpiDeviceEventController *controller = registry->device_event_controller; @@ -610,52 +605,20 @@ spi_registry_init (SpiRegistry *registry) registry->object_listeners = NULL; registry->window_listeners = NULL; registry->toolkit_listeners = NULL; - registry->applications = NULL; registry->desktop = spi_desktop_new(); registry->device_event_controller = NULL; registry->kbd_event_hook = _device_event_controller_hook; } -GType -spi_registry_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo tinfo = { - sizeof (SpiRegistryClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) spi_registry_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class data */ - sizeof (SpiRegistry), - 0, /* n preallocs */ - (GInstanceInitFunc) spi_registry_init, - NULL /* value table */ - }; - /* - * Here we use bonobo_type_unique instead of - * gtk_type_unique, this auto-generates a load of - * CORBA structures for us. All derived types must - * use bonobo_type_unique. - */ - type = bonobo_type_unique ( - PARENT_TYPE, - POA_Accessibility_Registry__init, - NULL, - G_STRUCT_OFFSET (SpiRegistryClass, epv), - &tinfo, - "SpiRegistry"); - } - - return type; -} +BONOBO_TYPE_FUNC_FULL (SpiRegistry, + Accessibility_Registry, + PARENT_TYPE, + spi_registry); SpiRegistry * spi_registry_new (void) { - SpiRegistry *retval = - SPI_REGISTRY (g_object_new (spi_registry_get_type (), NULL)); + SpiRegistry *retval = g_object_new (SPI_REGISTRY_TYPE, NULL); + bonobo_object_set_immortal (BONOBO_OBJECT (retval), TRUE); return retval; }