From: michael Date: Wed, 25 May 2005 10:53:00 +0000 (+0000) Subject: 2005-05-25 Michael Meeks X-Git-Tag: AT_SPI2_CORE_0_1_3~506 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=50c1c4d45f8bca36c074e924078360b3fdeee991;p=platform%2Fupstream%2Fat-spi2-core.git 2005-05-25 Michael Meeks * registryd/registry.c (remove_listener_cb), (impl_accessibility_registry_deregister_global_event_listener), (impl_accessibility_registry_deregister_global_event_listener_all): pass a closure to the remove callback to filter listeners more accurately on remove. git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@753 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- diff --git a/ChangeLog b/ChangeLog index fed2458..9dce19e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-05-25 Michael Meeks + + * registryd/registry.c (remove_listener_cb), + (impl_accessibility_registry_deregister_global_event_listener), + (impl_accessibility_registry_deregister_global_event_listener_all): + pass a closure to the remove callback to filter listeners more + accurately on remove. + 2005-04-05 Bill Haneman * configure.in: Revved to 1.6.4. diff --git a/registryd/registry.c b/registryd/registry.c index 2d2ae74..39855bb 100644 --- a/registryd/registry.c +++ b/registryd/registry.c @@ -423,20 +423,30 @@ 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.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 +465,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 +492,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); }