From f8e93775c066b193090beeb03c23fbaeaec2486b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 14 Feb 2018 21:14:52 -0500 Subject: [PATCH] efl.access: remove parent property most of this is just a reimplementation of efl_provider_find --- src/lib/elementary/efl_access.c | 39 ++++++++++--------------- src/lib/elementary/efl_access.eo | 11 +------ src/lib/elementary/efl_ui_widget.c | 26 ++++++----------- src/lib/elementary/efl_ui_widget.eo | 1 - src/lib/elementary/efl_ui_win.c | 12 ++------ src/lib/elementary/efl_ui_win.eo | 3 +- src/lib/elementary/elm_atspi_bridge.c | 12 ++++---- src/lib/elementary/elm_gengrid.c | 3 -- src/lib/elementary/elm_list.c | 16 ++-------- src/lib/elementary/elm_list.eo | 2 +- src/lib/elementary/elm_menu.c | 8 +++-- src/lib/elementary/elm_menu_item.eo | 2 +- src/lib/elementary/elm_toolbar.c | 4 +-- src/lib/elementary/elm_toolbar.eo | 2 +- src/tests/elementary/elm_test_gengrid.c | 2 +- src/tests/elementary/elm_test_list.c | 11 +++---- 16 files changed, 53 insertions(+), 101 deletions(-) diff --git a/src/lib/elementary/efl_access.c b/src/lib/elementary/efl_access.c index 1e956429e8..0970383017 100644 --- a/src/lib/elementary/efl_access.c +++ b/src/lib/elementary/efl_access.c @@ -146,7 +146,7 @@ _efl_access_index_in_parent_get(Eo *obj, Efl_Access_Data *pd EINA_UNUSED) Eo *chld, *parent = NULL; int ret = 0; - parent = efl_access_parent_get(obj); + parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); if (!parent) return -1; children = efl_access_children_get(parent); @@ -167,29 +167,20 @@ _efl_access_index_in_parent_get(Eo *obj, Efl_Access_Data *pd EINA_UNUSED) return ret; } -EOLIAN static Efl_Access * -_efl_access_parent_get(Eo *obj EINA_UNUSED, Efl_Access_Data *pd EINA_UNUSED) + +EOLIAN static Efl_Object * +_efl_access_efl_object_provider_find(const Eo *obj, Efl_Access_Data *pd EINA_UNUSED, const Efl_Object *klass) { - Efl_Access_Type type; - Eo *parent = obj; - - do { - parent = efl_parent_get(obj); - if (efl_isa(parent, EFL_ACCESS_MIXIN)) - { - type = efl_access_type_get(parent); - if (type != EFL_ACCESS_TYPE_SKIPPED) break; - } - } while (parent); - - return efl_isa(parent, EFL_ACCESS_MIXIN) ? parent : NULL; -} - -EOLIAN static void -_efl_access_parent_set(Eo *obj, Efl_Access_Data *pd EINA_UNUSED, Efl_Access *new_parent EINA_UNUSED) -{ - WRN("The %s object does not implement the \"accessible_parent_set\" function.", - efl_class_name_get(efl_class_get(obj))); + if (efl_isa(obj, klass)) + { + if (klass == EFL_ACCESS_MIXIN) + { + Efl_Access_Type type = efl_access_type_get(obj); + if (type != EFL_ACCESS_TYPE_SKIPPED) return (Eo*)obj; + } + else return (Eo*)obj; + } + return efl_provider_find(efl_super(obj, EFL_ACCESS_MIXIN), klass); } EOLIAN Eina_List* @@ -674,7 +665,7 @@ _efl_access_type_set(Eo *obj, Efl_Access_Data *pd, Efl_Access_Type val) if (val == pd->type) return; - parent = efl_access_parent_get(obj); + parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); switch (val) { diff --git a/src/lib/elementary/efl_access.eo b/src/lib/elementary/efl_access.eo index d289ed47d5..fa3fe0863a 100644 --- a/src/lib/elementary/efl_access.eo +++ b/src/lib/elementary/efl_access.eo @@ -353,16 +353,6 @@ mixin Efl.Access (Efl.Interface, Efl.Object) description: string; [[Accessible contextual information]] } } - @property parent @beta { - [[Object's accessible parent.]] - get { - } - set { - } - values { - parent: Efl.Access; [[Accessible parent]] - } - } @property state_set @protected @beta { [[Gets set describing object accessible states.]] get { @@ -469,6 +459,7 @@ mixin Efl.Access (Efl.Interface, Efl.Object) } implements { Efl.Object.destructor; + Efl.Object.provider_find; } events { property,changed: string; [[Called when property has changed]] diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index 9cb8acc08d..7fc327ceb6 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -1565,7 +1565,7 @@ _efl_ui_widget_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob if (_elm_config->atspi_mode && !sd->on_create) { Efl_Access *aparent; - aparent = efl_access_parent_get(sobj); + aparent = efl_provider_find(efl_parent_get(sobj), EFL_ACCESS_MIXIN); if (aparent) efl_access_children_changed_added_signal_emit(aparent, sobj); } @@ -1643,7 +1643,7 @@ _efl_ui_widget_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob if (_elm_config->atspi_mode && !sd->on_destroy) { Efl_Access *aparent; - aparent = efl_access_parent_get(sobj); + aparent = efl_provider_find(efl_parent_get(sobj), EFL_ACCESS_MIXIN); if (aparent) efl_access_children_changed_del_signal_emit(aparent, sobj); } @@ -5407,21 +5407,6 @@ _efl_ui_widget_efl_access_children_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Dat return accs; } -EOLIAN static Eo* -_efl_ui_widget_efl_access_parent_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) -{ - Efl_Access_Type type; - Efl_Access *parent = obj; - - do { - ELM_WIDGET_DATA_GET_OR_RETURN(parent, wd, NULL); - parent = wd->parent_obj; - type = efl_access_type_get(parent); - } while (parent && (type == EFL_ACCESS_TYPE_SKIPPED)); - - return efl_isa(parent, EFL_ACCESS_MIXIN) ? parent : NULL; -} - EOLIAN static Efl_Access_State_Set _efl_ui_widget_efl_access_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) { @@ -5573,6 +5558,13 @@ _efl_ui_widget_efl_object_provider_find(const Eo *obj, Elm_Widget_Smart_Data *pd if ((klass == EFL_CONFIG_INTERFACE) || (klass == EFL_CONFIG_GLOBAL_CLASS)) return _efl_config_obj; + if (klass == EFL_ACCESS_MIXIN) + { + Efl_Access_Type type = efl_access_type_get(obj); + if (type != EFL_ACCESS_TYPE_SKIPPED) + return (Eo*)obj; + } + if (pd->provider_lookup) return NULL; pd->provider_lookup = EINA_TRUE; diff --git a/src/lib/elementary/efl_ui_widget.eo b/src/lib/elementary/efl_ui_widget.eo index 3c6b7561dc..767de9ce73 100644 --- a/src/lib/elementary/efl_ui_widget.eo +++ b/src/lib/elementary/efl_ui_widget.eo @@ -588,7 +588,6 @@ abstract Efl.Ui.Widget (Efl.Canvas.Group, Efl.Access, Efl.Access.i18n_name { get; } Efl.Access.state_set { get; } Efl.Access.children { get; } - Efl.Access.parent { get; } Efl.Access.attributes { get; } Efl.Access.Component.focus_grab; Efl.Ui.Focus.Object.focus_manager { get; } diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 5ab1e72874..434c2df884 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -6984,15 +6984,6 @@ _efl_ui_win_efl_object_debug_name_override(Eo *obj, Efl_Ui_Win_Data *pd, Eina_St eina_strbuf_append_printf(sb, ":'%s':'%s'", pd->name, pd->title); } -EOLIAN static Eo* -_efl_ui_win_efl_access_parent_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd EINA_UNUSED) -{ - // attach all kinds of windows directly to ATSPI application root object - Eo *root; - root = efl_access_root_get(EFL_ACCESS_MIXIN); - return root; -} - EOLIAN static const Efl_Access_Action_Data* _efl_ui_win_efl_access_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd EINA_UNUSED) { @@ -7077,6 +7068,9 @@ _efl_ui_win_efl_object_provider_find(const Eo *obj, if (klass == EFL_UI_WIN_CLASS) return (Eo *)obj; + // attach all kinds of windows directly to ATSPI application root object + if (klass == EFL_ACCESS_MIXIN) return efl_access_root_get(EFL_ACCESS_MIXIN); + if (klass == EFL_UI_FOCUS_PARENT_PROVIDER_INTERFACE) return pd->provider; diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 9c26d50814..18c634ffc3 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo @@ -771,6 +771,7 @@ class Efl.Ui.Win (Efl.Ui.Widget, Efl.Canvas, Efl.Canvas.Pointer, Efl.Access.Wind class.constructor; Efl.Object.constructor; Efl.Object.destructor; + Efl.Object.provider_find; Efl.Object.finalize; Efl.Object.debug_name_override; Efl.Gfx.visible { set; } @@ -787,7 +788,6 @@ class Efl.Ui.Win (Efl.Ui.Widget, Efl.Canvas, Efl.Canvas.Pointer, Efl.Access.Wind Efl.Ui.Focus.Object.on_focus_update; Efl.Ui.Widget.widget_event; Efl.Ui.Widget.focus_manager_create; - Efl.Access.parent { get; } Efl.Access.state_set { get; } Efl.Access.i18n_name { get; } Efl.Access.Component.extents { get; } @@ -818,7 +818,6 @@ class Efl.Ui.Win (Efl.Ui.Widget, Efl.Canvas, Efl.Canvas.Pointer, Efl.Access.Wind Efl.Content.content { get; set; } Efl.Content.content_unset; Efl.Part.part; - Efl.Object.provider_find; } constructors { .win_name; diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index cbdbafafe5..a02260d973 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -2094,7 +2094,7 @@ _accessible_property_get(const Eldbus_Service_Interface *interface, const char * } else if (!strcmp(property, "Parent")) { - ret_obj = efl_access_parent_get(obj); + ret_obj = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); Efl_Access_Role role = EFL_ACCESS_ROLE_INVALID; role = efl_access_role_get(obj); if ((!ret_obj) && (EFL_ACCESS_ROLE_APPLICATION == role)) @@ -2821,7 +2821,7 @@ _collection_sort_order_reverse_canonical(struct collection_match_rule *rule, Ein /* Get the current nodes index in it's parent and the parent object. */ indexinparent = efl_access_index_in_parent_get(obj); - parent = efl_access_parent_get(obj); + parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); if ((indexinparent > 0) && ((max == 0) || (count < max))) { @@ -2877,7 +2877,7 @@ _collection_inorder(Eo *collection, struct collection_match_rule *rule, Eina_Lis while ((max == 0 || count < max) && obj && obj != collection) { Eo *parent; - parent = efl_access_parent_get(obj); + parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); idx = efl_access_index_in_parent_get(obj); count = _collection_sort_order_canonical(rule, list, count, max, parent, idx + 1, EINA_TRUE, NULL, EINA_TRUE, traverse); @@ -2955,7 +2955,7 @@ _collection_get_matches_from_handle(Eo *collection, Eo *current, struct collecti break; case ATSPI_Collection_TREE_RESTRICT_CHILDREN: idx = efl_access_index_in_parent_get(current); - parent = efl_access_parent_get(current); + parent = efl_provider_find(efl_parent_get(current), EFL_ACCESS_MIXIN); _collection_query(rule, sortby, &result, 0, max, parent, idx, EINA_FALSE, NULL, EINA_TRUE, traverse); break; case ATSPI_Collection_TREE_RESTRICT_SIBLING: @@ -3016,7 +3016,7 @@ _collection_get_matches_to_handle(Eo *obj, Eo *current, struct collection_match_ Eo *collection = obj; if (limit) - collection = efl_access_parent_get(obj); + collection = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_MIXIN); switch (tree) { @@ -3218,7 +3218,7 @@ _cache_item_reference_append_cb(Eo *bridge, Eo *data, Eldbus_Message_Iter *iter_ _bridge_iter_object_reference_append(bridge, iter_struct, root); Eo *parent = NULL; - parent = efl_access_parent_get(data); + parent = efl_provider_find(efl_parent_get(data), EFL_ACCESS_MIXIN); /* Marshall parent */ if ((!parent) && (EFL_ACCESS_ROLE_APPLICATION == role)) _object_desktop_reference_append(iter_struct); diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c index d07fe96c0b..3834614629 100644 --- a/src/lib/elementary/elm_gengrid.c +++ b/src/lib/elementary/elm_gengrid.c @@ -3878,7 +3878,6 @@ _internal_elm_gengrid_clear(Evas_Object *obj, if (itn) itn->walking++; /* prevent early death of subitem */ if (VIEW(it)) _item_mouse_callbacks_del(it, VIEW(it)); - it->del_cb(it); efl_del(EO_OBJ(it)); if (itn) itn->walking--; } @@ -3949,7 +3948,6 @@ _item_select(Elm_Gen_Item *it) { if ((!it->walking) && (it->generation < sd->generation)) { - it->del_cb(it); efl_del(eo_it); sd->last_selected_item = NULL; } @@ -3989,7 +3987,6 @@ _elm_gengrid_item_new(Elm_Gengrid_Data *sd, it->func.func = func; it->func.data = func_data; - it->del_cb = (Ecore_Cb)_item_del; it->highlight_cb = (Ecore_Cb)_item_highlight; it->unhighlight_cb = (Ecore_Cb)_item_unhighlight; it->sel_cb = (Ecore_Cb)_item_select; diff --git a/src/lib/elementary/elm_list.c b/src/lib/elementary/elm_list.c index 718d4737f2..624775e43e 100644 --- a/src/lib/elementary/elm_list.c +++ b/src/lib/elementary/elm_list.c @@ -656,8 +656,6 @@ _elm_list_deletions_process(Elm_List_Data *sd) { sd->items = eina_list_remove_list(sd->items, it->node); - /* issuing free because of "locking" item del pre hook */ - _elm_list_item_free(it); efl_del(EO_OBJ(it)); } @@ -2282,11 +2280,8 @@ _item_new(Evas_Object *obj, VIEW(it) = edje_object_add(evas_object_evas_get(obj)); edje_object_update_hints_set(VIEW(it), 1); - if (_elm_config->atspi_mode) - { - if (it->icon) efl_access_parent_set(it->icon, eo_it); - if (it->end) efl_access_parent_set(it->end, eo_it); - } + if (it->icon) efl_parent_set(it->icon, eo_it); + if (it->end) efl_parent_set(it->end, eo_it); /* access */ if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) @@ -2441,10 +2436,6 @@ _elm_list_efl_canvas_group_group_del(Eo *obj, Elm_List_Data *sd) EINA_LIST_FREE(sd->items, eo_it) { - ELM_LIST_ITEM_DATA_GET(eo_it, it); - /* issuing free because of "locking" item del pre hook */ - _elm_list_item_free(it); - WIDGET(it) = NULL; efl_del(eo_it); } @@ -2706,9 +2697,6 @@ _elm_list_clear(Eo *obj, Elm_List_Data *sd) EINA_LIST_FREE(sd->items, eo_it) { - ELM_LIST_ITEM_DATA_GET(eo_it, it); - /* issuing free because of "locking" item del pre hook */ - _elm_list_item_free(it); efl_del(eo_it); } diff --git a/src/lib/elementary/elm_list.eo b/src/lib/elementary/elm_list.eo index 4e5cc2b6c9..de1c72ede9 100644 --- a/src/lib/elementary/elm_list.eo +++ b/src/lib/elementary/elm_list.eo @@ -37,7 +37,7 @@ enum Elm.List.Mode } class Elm.List (Efl.Ui.Layout, Elm.Interface_Scrollable, - Efl.Access.Widget.Action, Efl.Access.Selection, + Efl.Access.Widget.Action, Efl.Access.Selection, Efl.Access, Efl.Ui.Clickable, Efl.Ui.Selectable, Efl.Ui.Legacy) { [[Elementary list class]] diff --git a/src/lib/elementary/elm_menu.c b/src/lib/elementary/elm_menu.c index 94bd613232..db01aef4c3 100644 --- a/src/lib/elementary/elm_menu.c +++ b/src/lib/elementary/elm_menu.c @@ -1393,10 +1393,12 @@ _elm_menu_item_efl_access_children_get(Eo *obj EINA_UNUSED, Elm_Menu_Item_Data * return eina_list_clone(sd->submenu.items); } -EOLIAN static Efl_Access* -_elm_menu_item_efl_access_parent_get(Eo *obj EINA_UNUSED, Elm_Menu_Item_Data *sd) +EOLIAN static Eo* +_elm_menu_item_efl_object_parent_get(Eo *obj, Elm_Menu_Item_Data *sd) { - return sd->parent ? EO_OBJ(sd->parent) : WIDGET(sd); + if (sd->parent) return EO_OBJ(sd->parent); + if (sd->base) return WIDGET(sd); + return efl_parent_get(efl_super(obj, ELM_MENU_ITEM_CLASS)); } EOLIAN static Efl_Access_Role diff --git a/src/lib/elementary/elm_menu_item.eo b/src/lib/elementary/elm_menu_item.eo index 6011399070..4af98a6db5 100644 --- a/src/lib/elementary/elm_menu_item.eo +++ b/src/lib/elementary/elm_menu_item.eo @@ -59,12 +59,12 @@ class Elm.Menu.Item(Elm.Widget.Item, Efl.Access.Selection, implements { Efl.Object.constructor; Efl.Object.destructor; + Efl.Object.parent { get; } Elm.Widget.Item.disable; Elm.Widget.Item.signal_emit; Elm.Widget.Item.part_text { get; set; } Elm.Widget.Item.part_content { get; set; } Efl.Access.children { get; } - Efl.Access.parent { get; } Efl.Access.role { get; } Efl.Access.i18n_name { get; } Efl.Access.state_set { get; } diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c index f24eb444b8..313ccf78a1 100644 --- a/src/lib/elementary/elm_toolbar.c +++ b/src/lib/elementary/elm_toolbar.c @@ -2401,9 +2401,7 @@ _item_new(Evas_Object *obj, efl_access_type_set(VIEW(it), EFL_ACCESS_TYPE_DISABLED); icon_obj = elm_icon_add(VIEW(it)); - - if (_elm_config->atspi_mode) - if (icon_obj) efl_access_parent_set(icon_obj, eo_it); + efl_parent_set(icon_obj, eo_it); if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) _access_widget_item_register(it); diff --git a/src/lib/elementary/elm_toolbar.eo b/src/lib/elementary/elm_toolbar.eo index 00704c709a..1a6be490a8 100644 --- a/src/lib/elementary/elm_toolbar.eo +++ b/src/lib/elementary/elm_toolbar.eo @@ -24,7 +24,7 @@ enum Elm.Toolbar.Shrink_Mode } class Elm.Toolbar (Efl.Ui.Widget, Efl.Ui.Focus.Composition, Elm.Interface_Scrollable, Efl.Ui.Direction, - Efl.Access.Widget.Action, Efl.Access.Selection, + Efl.Access.Widget.Action, Efl.Access.Selection, Efl.Access, Efl.Ui.Clickable, Efl.Ui.Selectable, Efl.Ui.Menu, Efl.Ui.Legacy) { [[Elementary toolbar class]] diff --git a/src/tests/elementary/elm_test_gengrid.c b/src/tests/elementary/elm_test_gengrid.c index 69d4b21837..cec5f763fa 100644 --- a/src/tests/elementary/elm_test_gengrid.c +++ b/src/tests/elementary/elm_test_gengrid.c @@ -87,7 +87,7 @@ START_TEST(elm_atspi_children_parent) elm_gengrid_item_fields_update(it, "*.", ELM_GENGRID_ITEM_FIELD_CONTENT); ck_assert(content != NULL); - parent = efl_access_parent_get(content); + parent = efl_provider_find(efl_parent_get(content), EFL_ACCESS_MIXIN); ck_assert(it == parent); elm_shutdown(); diff --git a/src/tests/elementary/elm_test_list.c b/src/tests/elementary/elm_test_list.c index 0c5f5c46a9..f303ffa107 100644 --- a/src/tests/elementary/elm_test_list.c +++ b/src/tests/elementary/elm_test_list.c @@ -231,6 +231,7 @@ END_TEST START_TEST(elm_atspi_children_parent) { Efl_Access *parent; + Elm_Object_Item *it; elm_init(1, NULL); Evas_Object *win = elm_win_add(NULL, "list", ELM_WIN_BASIC); @@ -239,15 +240,15 @@ START_TEST(elm_atspi_children_parent) Evas_Object *end = elm_icon_add(win); Evas_Object *list = elm_list_add(win); - elm_list_item_append(list, "First Element", icon, end, NULL, NULL); + it = elm_list_item_append(list, "First Element", icon, end, NULL, NULL); evas_object_show(list); - parent = efl_access_parent_get(icon); - ck_assert(list == parent); + parent = efl_provider_find(efl_parent_get(icon), EFL_ACCESS_MIXIN); + ck_assert(it == parent); - parent = efl_access_parent_get(end); - ck_assert(list == parent); + parent = efl_provider_find(efl_parent_get(end), EFL_ACCESS_MIXIN); + ck_assert(it == parent); elm_shutdown(); }