X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fregistry.c;h=417847a990cf8e82a58ac7192e88323931edaad1;hb=9f9b0fca25c77e77088a5432cf31da6f13a65a91;hp=1bd0fb293639bc4653f03af545b4e485dfe2a727;hpb=e5e0ce98187e8000ab5d8bd3c48f48c69def1545;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/registryd/registry.c b/registryd/registry.c index 1bd0fb2..417847a 100644 --- a/registryd/registry.c +++ b/registryd/registry.c @@ -2,7 +2,8 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2001 Sun Microsystems Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -23,6 +24,7 @@ /* registry.c: the main accessibility service registry implementation */ #undef SPI_LISTENER_DEBUG +#undef SPI_DEBUG #include #ifdef SPI_DEBUG @@ -46,12 +48,12 @@ typedef enum { ETYPE_WINDOW, ETYPE_TOOLKIT, ETYPE_KEYBOARD, - + ETYPE_MOUSE, ETYPE_LAST_DEFINED } EventTypeCategory; typedef struct { - char *event_name; + const char *event_name; EventTypeCategory type_cat; GQuark major; /* from string segment[1] */ GQuark minor; /* from string segment[1]+segment[2] */ @@ -64,7 +66,6 @@ typedef struct { EventTypeCategory event_type_cat; } SpiListenerStruct; - SpiListenerStruct * spi_listener_struct_new (Accessibility_EventListener listener, CORBA_Environment *ev) { @@ -81,22 +82,22 @@ spi_listener_struct_free (SpiListenerStruct *ls, CORBA_Environment *ev) g_free (ls); } - static void desktop_add_application (SpiDesktop *desktop, guint index, gpointer data) { - BonoboObject *registry = BONOBO_OBJECT(data); + BonoboObject *registry = BONOBO_OBJECT (data); Accessibility_Event e; CORBA_Environment ev; - e.type = g_strdup ("object:children-changed::add"); + 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), + Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry), &e, &ev); + Accessibility_Desktop_unref (e.source, &ev); CORBA_exception_free (&ev); } @@ -106,22 +107,22 @@ static void desktop_remove_application (SpiDesktop *desktop, guint index, gpointer data) { - BonoboObject *registry = BONOBO_OBJECT(data); + BonoboObject *registry = BONOBO_OBJECT (data); Accessibility_Event e; CORBA_Environment ev; - e.type = g_strdup ("object:children-changed::remove"); + 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), + Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry), &e, &ev); + Accessibility_Desktop_unref (e.source, &ev); CORBA_exception_free (&ev); } - static void spi_registry_object_finalize (GObject *object) { @@ -240,12 +241,16 @@ parse_event_type (EventTypeStruct *etype, const char *event_name) gchar *s; split_string = g_strsplit (event_name, ":", 4); - etype->event_name = g_strdup (event_name); + etype->event_name = event_name; if (!g_ascii_strncasecmp (event_name, "focus:", 6)) { etype->type_cat = ETYPE_FOCUS; } + else if (!g_ascii_strncasecmp (event_name, "mouse:", 6)) + { + etype->type_cat = ETYPE_MOUSE; + } else if (!g_ascii_strncasecmp (event_name, "object:", 7)) { etype->type_cat = ETYPE_OBJECT; @@ -261,6 +266,7 @@ parse_event_type (EventTypeStruct *etype, const char *event_name) 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)); @@ -268,23 +274,16 @@ parse_event_type (EventTypeStruct *etype, const char *event_name) if (split_string[3]) { etype->detail = g_quark_from_string (split_string[3]); - s = g_strconcat (split_string[1], split_string[2], split_string[3], NULL); - etype->major = g_quark_from_string (s); - g_free (s); } else { etype->detail = g_quark_from_static_string (""); - s = g_strconcat (split_string[1], split_string[2], NULL); - etype->major = g_quark_from_string (s); - g_free (s); } } else { - etype->major = g_quark_from_string (split_string[1]); etype->minor = etype->major; - etype->detail = etype->major; + etype->detail = g_quark_from_static_string (""); //etype->major; } } else @@ -336,6 +335,7 @@ get_listener_list (SpiRegistry *registry, case ETYPE_WINDOW: ret = ®istry->window_listeners; break; + case ETYPE_MOUSE: case ETYPE_TOOLKIT: ret = ®istry->toolkit_listeners; break; @@ -357,18 +357,19 @@ impl_accessibility_registry_register_global_event_listener ( const CORBA_char *event_name, CORBA_Environment *ev) { - SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); + SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); SpiListenerStruct *ls = spi_listener_struct_new (listener, ev); EventTypeStruct etype; GList **list; -#ifdef SPI_DEBUG +#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.major; + ls->event_type_quark = etype.minor; ls->event_type_cat = etype.type_cat; list = get_listener_list (registry, etype.type_cat); @@ -558,40 +559,46 @@ notify_listeners_cb (GList * const *list, gpointer user_data) ls = (*list)->data; #ifdef SPI_LISTENER_DEBUG - fprintf (stderr, "event quarks: %lx %lx %lx\n", ls->event_type_quark, etype.major, etype.minor); - fprintf (stderr, "event name: %s\n", etype.event_name); + 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 if ((ls->event_type_quark == ctx->etype.major) || (ls->event_type_quark == ctx->etype.minor)) { #ifdef SPI_DEBUG - fprintf (stderr, "notifying listener %d\n", g_list_index (listeners, l->data)); - s = Accessibility_Accessible__get_name (ctx->source, ev); + 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 = bonobo_object_dup_ref (ctx->source, ctx->ev); + ctx->e_out.source = CORBA_Object_duplicate (ctx->source, ctx->ev); + if (BONOBO_EX (ctx->ev)) { - return SPI_RE_ENTRANT_CONTINUE;; + 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_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 */ { - bonobo_object_release_unref (ctx->e_out.source, ctx->ev); + CORBA_Object_release (ctx->e_out.source, ctx->ev); } } @@ -618,15 +625,10 @@ impl_registry_notify_event (PortableServer_Servant servant, ctx.ev = ev; ctx.e_out = *e; ctx.source = e->source; - parse_event_type (&ctx.etype, e->type); spi_re_entrant_list_foreach (list, notify_listeners_cb, &ctx); } - if (e->source != CORBA_OBJECT_NIL) - { - Accessibility_Accessible_unref (e->source, ev); - } } @@ -661,12 +663,17 @@ spi_registry_init (SpiRegistry *registry) 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), (gpointer)registry); - g_signal_connect (G_OBJECT (registry->desktop), "application_removed", - G_CALLBACK(desktop_remove_application), (gpointer)registry); + 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; + registry->de_controller = spi_device_event_controller_new (registry); } BONOBO_TYPE_FUNC_FULL (SpiRegistry,