diff options
author | Lukasz Stanislawski <l.stanislaws@samsung.com> | 2015-06-27 12:52:02 +0200 |
---|---|---|
committer | Lukasz Stanislawski <l.stanislaws@samsung.com> | 2015-06-29 09:15:54 +0200 |
commit | 20183c057324c5bb1ac92eaad2720d6685935072 (patch) | |
tree | 05f651a74775813f660f3f9ca7d39f6159a067b2 | |
parent | 565f39006adc1a3e4723d461f5a444a1a23afbc0 (diff) | |
download | elementary-20183c057324c5bb1ac92eaad2720d6685935072.tar.gz |
atspi: properly unregister itnerfaces
Change-Id: Iccda034fabb457024ed97c669eb3b024ecafbe82
-rw-r--r-- | src/lib/elm_atspi_bridge.c | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/src/lib/elm_atspi_bridge.c b/src/lib/elm_atspi_bridge.c index 934e4e27a..4cbd955ff 100644 --- a/src/lib/elm_atspi_bridge.c +++ b/src/lib/elm_atspi_bridge.c @@ -2945,7 +2945,7 @@ _state_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Descr Elm_Atspi_Event_State_Changed_Data *state_data = event_info; char *type_desc; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_FALSE); - ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc, EINA_FALSE); + ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT, ifc, EINA_FALSE); if (!STATE_TYPE_GET(pd->object_state_broadcast_mask, state_data->type)) return EINA_FALSE; @@ -2982,7 +2982,7 @@ _property_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const Eo_Event_De enum _Atspi_Object_Property prop = ATSPI_OBJECT_PROPERTY_LAST; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_FALSE); - ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc, EINA_FALSE); + ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT, ifc, EINA_FALSE); if (!strcmp(property, "parent")) { @@ -3033,7 +3033,7 @@ _children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *d enum _Atspi_Object_Child_Event_Type type; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_FALSE); - ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc, EINA_FALSE); + ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT, ifc, EINA_FALSE); type = ev_data->is_added ? ATSPI_OBJECT_CHILD_ADDED : ATSPI_OBJECT_CHILD_REMOVED; @@ -3060,9 +3060,6 @@ _children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *d _bridge_signal_send(data, ifc, ATSPI_OBJECT_EVENT_CHILDREN_CHANGED, atspi_desc, idx, 0, "(so)", eldbus_connection_unique_name_get(pd->a11y_bus), ev_data->child); - if (type == ATSPI_OBJECT_CHILD_REMOVED) - _bridge_object_unregister(data, ev_data->child); - return EINA_TRUE; } @@ -3130,7 +3127,7 @@ static Eina_Bool _selection_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) { ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_TRUE); - ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc, EINA_FALSE); + ELM_ATSPI_OBJECT_INTERFACE_GET_OR_RETURN_VAL(obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT, ifc, EINA_FALSE); if (!STATE_TYPE_GET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_SELECTION_CHANGED)) return EINA_FALSE; @@ -3302,6 +3299,7 @@ _bridge_object_unregister(Eo *bridge, Eo *obj) { char *path; Eldbus_Message *sig; + Eldbus_Service_Interface *ifc; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd); @@ -3309,11 +3307,29 @@ _bridge_object_unregister(Eo *bridge, Eo *obj) sig = eldbus_service_signal_new(pd->cache_interface, ATSPI_OBJECT_CHILD_REMOVED); Eldbus_Message_Iter *iter = eldbus_message_iter_get(sig); - _iter_object_reference_append(iter, obj); - eldbus_service_signal_send(pd->cache_interface, sig); - // TODO eldbus_service_object_unregister(); + + eo_do(obj, ifc = eo_key_data_get(ATSPI_DBUS_INTERFACE_EVENT_OBJECT)); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_ACTION_MIXIN))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_COMPONENT_MIXIN))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_EDITABLE_TEXT_INTERFACE))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_IMAGE_MIXIN))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_SELECTION_INTERFACE))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_TEXT_INTERFACE))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_WINDOW_INTERFACE))); + if (ifc) eldbus_service_interface_unregister(ifc); + eo_do(obj, ifc = eo_key_data_get(eo_class_name_get(ELM_INTERFACE_ATSPI_VALUE_INTERFACE))); + if (ifc) eldbus_service_interface_unregister(ifc); path = _bridge_path_from_object(bridge, obj); eina_hash_del(pd->cache, path, obj); @@ -3526,45 +3542,52 @@ static void _bridge_object_register(Eo *bridge, Eo *obj) ifc = eldbus_service_interface_register(pd->a11y_bus, path, &accessible_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc)); ifc = eldbus_service_interface_register(pd->a11y_bus, path, &event_iface_desc); eo_do(obj, eo_event_callback_array_add(_events_cb(), bridge), - eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN), ifc) + eo_key_data_set(ATSPI_DBUS_INTERFACE_EVENT_OBJECT, ifc) ); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); if (eo_isa(obj, ELM_INTERFACE_ATSPI_ACTION_MIXIN)) { - eldbus_service_interface_register(pd->a11y_bus, path, &action_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &action_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_ACTION_MIXIN), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_COMPONENT_MIXIN)) { - eldbus_service_interface_register(pd->a11y_bus, path, &component_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &component_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_COMPONENT_MIXIN), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_EDITABLE_TEXT_INTERFACE)) { - eldbus_service_interface_register(pd->a11y_bus, path, &editable_text_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &editable_text_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_TEXT_INTERFACE), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_IMAGE_MIXIN)) { - eldbus_service_interface_register(pd->a11y_bus, path, &image_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &image_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_IMAGE_MIXIN), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_SELECTION_INTERFACE)) { - eldbus_service_interface_register(pd->a11y_bus, path, &selection_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &selection_iface_desc); eo_do(obj, eo_event_callback_array_add(_selection_cb(), bridge)); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_SELECTION_INTERFACE), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_TEXT_INTERFACE)) { - eldbus_service_interface_register(pd->a11y_bus, path, &text_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &text_iface_desc); eo_do(obj, eo_event_callback_array_add(_text_cb(), bridge)); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_TEXT_INTERFACE), ifc)); } if (eo_isa(obj, ELM_INTERFACE_ATSPI_WINDOW_INTERFACE)) { @@ -3575,8 +3598,9 @@ static void _bridge_object_register(Eo *bridge, Eo *obj) } if (eo_isa(obj, ELM_INTERFACE_ATSPI_VALUE_INTERFACE)) { - eldbus_service_interface_register(pd->a11y_bus, path, &value_iface_desc); + ifc = eldbus_service_interface_register(pd->a11y_bus, path, &value_iface_desc); eldbus_service_object_data_set(ifc, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge); + eo_do(obj, eo_key_data_set(eo_class_name_get(ELM_INTERFACE_ATSPI_VALUE_INTERFACE), ifc)); } sig = eldbus_service_signal_new(pd->cache_interface, ATSPI_OBJECT_CHILD_ADDED); |