diff --git a/legacy/elementary/src/lib/elm_access.c b/legacy/elementary/src/lib/elm_access.c index c35a48b354..c6c8a91e45 100644 --- a/legacy/elementary/src/lib/elm_access.c +++ b/legacy/elementary/src/lib/elm_access.c @@ -164,21 +164,7 @@ _access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS static void _access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { - Elm_Access_Info *ac; - - evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOUSE_IN, - _access_obj_mouse_in_cb, data); - evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOUSE_OUT, - _access_obj_mouse_out_cb, data); - evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL, - _access_obj_del_cb, data); - ac = evas_object_data_get(data, "_elm_access"); - evas_object_data_del(data, "_elm_access"); - if (ac) - { - _elm_access_clear(ac); - free(ac); - } + _elm_access_object_unregister(data, obj); // _elm_access_edje_object_part_object_register(); set below object data evas_object_data_del(obj, "_part_access_obj"); @@ -640,6 +626,27 @@ _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj) evas_object_data_set(obj, "_elm_access", ac); } +EAPI void +_elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj) +{ + Elm_Access_Info *ac; + + evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_IN, + _access_obj_mouse_in_cb, obj); + evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_OUT, + _access_obj_mouse_out_cb, obj); + evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_DEL, + _access_obj_del_cb, obj); + + ac = evas_object_data_get(obj, "_elm_access"); + evas_object_data_del(obj, "_elm_access"); + if (ac) + { + _elm_access_clear(ac); + free(ac); + } +} + static Eina_Bool _access_item_over_timeout_cb(void *data) { @@ -727,6 +734,10 @@ _elm_access_widget_item_register(Elm_Widget_Item *item) if (!item) return; + /* check previous access object */ + if (item->access_obj) + _elm_access_widget_item_unregister(item); + // create access object ho = item->view; ao = _elm_access_add(item->widget); @@ -755,7 +766,7 @@ _elm_access_widget_item_unregister(Elm_Widget_Item *item) { Evas_Object *ho; - if (!item || item->access_obj) return; + if (!item || !item->access_obj) return; ho = item->view; evas_object_event_callback_del_full(ho, EVAS_CALLBACK_RESIZE, @@ -763,7 +774,10 @@ _elm_access_widget_item_unregister(Elm_Widget_Item *item) evas_object_event_callback_del_full(ho, EVAS_CALLBACK_MOVE, _content_move, item->access_obj); + _elm_access_object_unregister(item->access_obj, ho); + evas_object_del(item->access_obj); + item->access_obj = NULL; } EAPI void diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index 563a49202c..ccbc6c11a4 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -4204,6 +4204,10 @@ _item_unrealize_cb(Elm_Gen_Item *it) EINA_LIST_FREE (it->item->flip_content_objs, content) evas_object_del(content); + /* access */ + if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) + _elm_access_widget_item_unregister((Elm_Widget_Item *)it); + // unswallow VIEW(it) first then manipulate VIEW(it) _decorate_item_unrealize(it); if (GL_IT(it)->wsd->decorate_all_mode) _decorate_all_item_unrealize(it); @@ -4685,7 +4689,7 @@ _elm_genlist_smart_member_add(Evas_Object *obj, } static void -_access_obj_process(Elm_Genlist_Smart_Data * sd, Eina_Bool is_access) +_access_obj_process(Elm_Genlist_Smart_Data *sd, Eina_Bool is_access) { Item_Block *itb; Eina_Bool done = EINA_FALSE; diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index b1099c6823..7d769402f8 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -1364,6 +1364,25 @@ _access_on_highlight_cb(void *data) elm_list_item_bring_in(it); } +static void +_access_widget_item_register(Elm_List_Item *it, Eina_Bool is_access) +{ + Elm_Access_Info *ai; + + if (!is_access) _elm_access_widget_item_unregister((Elm_Widget_Item *)it); + else + { + _elm_access_widget_item_register((Elm_Widget_Item *)it); + + ai = _elm_access_object_get(it->base.access_obj); + + _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("List Item")); + _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it); + _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it); + _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it); + } +} + static Elm_List_Item * _item_new(Evas_Object *obj, const char *label, @@ -1386,23 +1405,9 @@ _item_new(Evas_Object *obj, VIEW(it) = edje_object_add(evas_object_evas_get(obj)); - // ACCESS + /* access */ if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) - { - _elm_access_widget_item_register((Elm_Widget_Item *)it); - - _elm_access_text_set(_elm_access_object_get(it->base.access_obj), - ELM_ACCESS_TYPE, E_("List Item")); - _elm_access_callback_set(_elm_access_object_get(it->base.access_obj), - ELM_ACCESS_INFO, - _access_info_cb, it); - _elm_access_callback_set(_elm_access_object_get(it->base.access_obj), - ELM_ACCESS_STATE, - _access_state_cb, it); - _elm_access_on_highlight_hook_set( - _elm_access_object_get(it->base.access_obj), _access_on_highlight_cb, - it); - } + _access_widget_item_register(it, EINA_TRUE); edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj)); evas_object_event_callback_add @@ -1628,6 +1633,18 @@ _elm_list_smart_member_add(Evas_Object *obj, evas_object_raise(sd->hit_rect); } +static void +_elm_list_smart_access(Evas_Object *obj, Eina_Bool is_access) +{ + Eina_List *elist = NULL; + Elm_List_Item *it; + + ELM_LIST_DATA_GET(obj, sd); + + EINA_LIST_FOREACH(sd->items, elist, it) + _access_widget_item_register(it, is_access); +} + static void _elm_list_smart_set_user(Elm_List_Smart_Class *sc) { @@ -1645,6 +1662,7 @@ _elm_list_smart_set_user(Elm_List_Smart_Class *sc) ELM_WIDGET_CLASS(sc)->disable = _elm_list_smart_disable; ELM_WIDGET_CLASS(sc)->event = _elm_list_smart_event; ELM_WIDGET_CLASS(sc)->translate = _elm_list_smart_translate; + ELM_WIDGET_CLASS(sc)->access = _elm_list_smart_access; ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_list_smart_sizing_eval; } diff --git a/legacy/elementary/src/lib/elm_widget.h b/legacy/elementary/src/lib/elm_widget.h index 9c110c7ec7..1a70143b52 100644 --- a/legacy/elementary/src/lib/elm_widget.h +++ b/legacy/elementary/src/lib/elm_widget.h @@ -598,8 +598,9 @@ EAPI void _elm_access_object_hilight(Evas_Object *obj); EAPI void _elm_access_object_unhilight(Evas_Object *obj); EAPI void _elm_access_object_hilight_disable(Evas *e); EAPI void _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj); -EAPI void _elm_access_item_unregister(Elm_Widget_Item *item); +EAPI void _elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj); EAPI void _elm_access_item_register(Elm_Widget_Item *item, Evas_Object *hoverobj); +EAPI void _elm_access_item_unregister(Elm_Widget_Item *item); EAPI Eina_Bool _elm_access_2nd_click_timeout(Evas_Object *obj); EAPI void _elm_access_highlight_set(Evas_Object* obj); EAPI Evas_Object * _elm_access_edje_object_part_object_register(Evas_Object *obj, const Evas_Object *partobj, const char* part);