X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fregistry.c;h=c0e36bdeae526d67a7c7fd83520f41307fc16a45;hb=92d0ed0389bb83882127099d9089b08f79a2cbf0;hp=2d2ae74cc6b37241a9f11066e4dee37bd52991f3;hpb=67d9d66eb7ac15f59bdd9a2d4b4bb9f081f67ef7;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/registryd/registry.c b/registryd/registry.c index 2d2ae74..c0e36bd 100644 --- a/registryd/registry.c +++ b/registryd/registry.c @@ -116,7 +116,11 @@ desktop_add_application (SpiDesktop *desktop, /* FIXME spi_init_any_object (&e.any_data, a); */ - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + e.source, + Accessibility_ROLE_DESKTOP_FRAME, + ""); + Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry), &e, &ev); bonobo_object_release_unref (a, &ev); @@ -131,7 +135,7 @@ desktop_remove_application (SpiDesktop *desktop, { BonoboObject *registry = BONOBO_OBJECT (data); Accessibility_Event e; - Accessibility_Accessible a; + /* Accessibility_Accessible a; FIXME */ CORBA_Environment ev; CORBA_exception_init (&ev); @@ -140,13 +144,16 @@ desktop_remove_application (SpiDesktop *desktop, e.source = BONOBO_OBJREF (desktop); e.detail1 = index; e.detail2 = 0; + /* FIXME a = Accessibility_Accessible_getChildAtIndex (BONOBO_OBJREF (desktop), index, &ev); - /* FIXME spi_init_any_object (&e.any_data, a); */ - spi_init_any_nil (&e.any_data); - Accessibility_Accessible_unref (a, &ev); + spi_init_any_nil (&e.any_data, + e.source, + Accessibility_ROLE_DESKTOP_FRAME, + ""); + /* Accessibility_Accessible_unref (a, &ev); */ Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry), &e, &ev); Accessibility_Desktop_unref (e.source, &ev); @@ -423,20 +430,31 @@ impl_accessibility_registry_register_global_event_listener ( } } +typedef struct { + gboolean remove_all; + Accessibility_EventListener listener; + EventTypeStruct etype; +} RemoveListenerClosure; + static SpiReEntrantContinue remove_listener_cb (GList * const *list, gpointer user_data) { SpiListenerStruct *ls = (SpiListenerStruct *) (*list)->data; CORBA_Environment ev; - Accessibility_EventListener listener = user_data; + RemoveListenerClosure *cl = 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); - } + + if (cl->remove_all || (((cl->etype.minor == ls->event_type_quark) || + (cl->etype.major == ls->event_type_quark)) && + cl->etype.type_cat == ls->event_type_cat ) ) + { + if (CORBA_Object_is_equivalent (ls->listener, cl->listener, &ev)) + { + spi_re_entrant_list_delete_link (list); + spi_listener_struct_free (ls, &ev); + } + } CORBA_exception_free (&ev); @@ -455,14 +473,18 @@ impl_accessibility_registry_deregister_global_event_listener_all ( int i; GList **lists[3]; SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); + RemoveListenerClosure cl = { 0, }; lists[0] = ®istry->object_listeners; lists[1] = ®istry->window_listeners; lists[2] = ®istry->toolkit_listeners; + cl.remove_all = TRUE; + cl.listener = listener; + for (i = 0; i < sizeof (lists) / sizeof (lists[0]); i++) { - spi_re_entrant_list_foreach (lists [i], remove_listener_cb, listener); + spi_re_entrant_list_foreach (lists [i], remove_listener_cb, &cl); } } @@ -478,14 +500,16 @@ impl_accessibility_registry_deregister_global_event_listener ( CORBA_Environment *ev) { SpiRegistry *registry; - EventTypeStruct etype; + RemoveListenerClosure cl = { 0, }; registry = SPI_REGISTRY (bonobo_object_from_servant (servant)); - parse_event_type (&etype, (char *) event_name); + cl.remove_all = FALSE; + parse_event_type (&cl.etype, (char *) event_name); + cl.listener = listener; - spi_re_entrant_list_foreach (get_listener_list (registry, etype.type_cat), - remove_listener_cb, listener); + spi_re_entrant_list_foreach (get_listener_list (registry, cl.etype.type_cat), + remove_listener_cb, &cl); } @@ -694,6 +718,8 @@ registry_flush_event_queue (SpiRegistry *registry, } CORBA_free ((void *)q_ctx->etype.event_name); CORBA_free ((void *)q_ctx->e_out.type); + if (q_ctx->e_out.any_data._type != TC_null) + CORBA_free ((void *)q_ctx->e_out.any_data._value); g_free (q_ctx); } registry->is_queueing = FALSE; @@ -824,6 +850,8 @@ registry_queue_event (SpiRegistry *registry, NotifyContext *ctx) bonobo_object_release_unref (q_ctx->source, NULL); CORBA_free ((void *)q_ctx->etype.event_name); CORBA_free ((void *)q_ctx->e_out.type); + if (q_ctx->e_out.any_data._type != TC_null) + CORBA_free ((void *)q_ctx->e_out.any_data._value); g_free (q_ctx); return TRUE; }