stanluk pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=e2b1e28a12741b3be9db2aa4edae9e42877049e6
commit e2b1e28a12741b3be9db2aa4edae9e42877049e6 Author: Lukasz Stanislawski <l.stanisl...@samsung.com> Date: Thu Nov 26 16:53:32 2015 +0100 atspi: add type of accessibility object Type API provides possibility to skip/ignore widgets in accessiblity tree. It make sense to ignore object if it do not provide any valuable contextual information for disabled users. Skipped objects are usually container objects and are ommited in parent-child relationship. @feature --- src/lib/elm_atspi_app_object.c | 6 ++++- src/lib/elm_interface_atspi_accessible.c | 44 +++++++++++++++++++++++++++++-- src/lib/elm_interface_atspi_accessible.eo | 19 +++++++++++++ src/lib/elm_widget.c | 41 +++++++++++++++++++--------- 4 files changed, 95 insertions(+), 15 deletions(-) diff --git a/src/lib/elm_atspi_app_object.c b/src/lib/elm_atspi_app_object.c index 6e49891..11d5bb2 100644 --- a/src/lib/elm_atspi_app_object.c +++ b/src/lib/elm_atspi_app_object.c @@ -33,7 +33,11 @@ _elm_atspi_app_object_elm_interface_atspi_accessible_children_get(Eo *obj EINA_U EINA_LIST_FOREACH(_elm_win_list, l, win) { - if (eo_isa(win, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) + Elm_Atspi_Type type; + if (!eo_isa(win, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) + continue; + eo_do(win, type = elm_interface_atspi_accessible_type_get()); + if (type == ELM_ATSPI_TYPE_REGULAR) accs = eina_list_append(accs, win); } diff --git a/src/lib/elm_interface_atspi_accessible.c b/src/lib/elm_interface_atspi_accessible.c index 2a38380..357e609 100644 --- a/src/lib/elm_interface_atspi_accessible.c +++ b/src/lib/elm_interface_atspi_accessible.c @@ -129,6 +129,7 @@ struct _Elm_Interface_Atspi_Accessible_Data const char *translation_domain; Elm_Atspi_Relation_Set relations; Elm_Interface_Atspi_Accessible *parent; + Elm_Atspi_Type type: 2; }; typedef struct _Elm_Interface_Atspi_Accessible_Data Elm_Interface_Atspi_Accessible_Data; @@ -168,11 +169,25 @@ _elm_interface_atspi_accessible_index_in_parent_get(Eo *obj, Elm_Interface_Atspi EOLIAN static Elm_Interface_Atspi_Accessible * _elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd) { - return pd->parent; + Elm_Atspi_Type type; + Eo *parent = obj; + + if (pd->parent) return pd->parent; + + do { + eo_do(obj, parent = eo_parent_get()); + if (eo_isa(parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) + { + eo_do(parent, type = elm_interface_atspi_accessible_type_get()); + if (type != ELM_ATSPI_TYPE_SKIPPED) break; + } + } while (parent); + + return eo_isa(parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN) ? parent : NULL; } EOLIAN static void -_elm_interface_atspi_accessible_parent_set(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd, Elm_Interface_Atspi_Accessible *new_parent) +_elm_interface_atspi_accessible_parent_set(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED, Elm_Interface_Atspi_Accessible *new_parent) { if (pd->parent != new_parent) { @@ -314,6 +329,7 @@ _elm_interface_atspi_accessible_event_emit(Eo *class EINA_UNUSED, void *pd EINA_ { Eina_List *l; Elm_Atspi_Event_Handler *hdl; + Elm_Atspi_Type type; if (!accessible || !event || !eo_isa(accessible, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) { @@ -321,6 +337,18 @@ _elm_interface_atspi_accessible_event_emit(Eo *class EINA_UNUSED, void *pd EINA_ return; } + eo_do(accessible, type = elm_interface_atspi_accessible_type_get()); + if (type != ELM_ATSPI_TYPE_REGULAR) + return; + + if (event == ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED) + { + Elm_Atspi_Event_Children_Changed_Data *atspi_data = event_info; + eo_do(atspi_data->child, type = elm_interface_atspi_accessible_type_get()); + if (type != ELM_ATSPI_TYPE_REGULAR) + return; + } + EINA_LIST_FOREACH(global_callbacks, l, hdl) { if (hdl->cb) @@ -552,4 +580,16 @@ _elm_interface_atspi_accessible_root_get(Eo *class EINA_UNUSED, void *pd EINA_UN return root; } +EOLIAN Elm_Atspi_Type +_elm_interface_atspi_accessible_type_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd) +{ + return pd->type; +} + +EOLIAN void +_elm_interface_atspi_accessible_type_set(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd, Elm_Atspi_Type val) +{ + pd->type = val; +} + #include "elm_interface_atspi_accessible.eo.c" diff --git a/src/lib/elm_interface_atspi_accessible.eo b/src/lib/elm_interface_atspi_accessible.eo index f337e56..378674e 100644 --- a/src/lib/elm_interface_atspi_accessible.eo +++ b/src/lib/elm_interface_atspi_accessible.eo @@ -1,3 +1,11 @@ +enum Elm.Atspi.Type +{ + [[Type of accessibility object]] + regular, [[default accessibile object]] + disabled, [[skip object and its children in accessibility hierarchy]] + skipped [[skip object in accessibility hierarchy]] +} + mixin Elm_Interface_Atspi_Accessible () { legacy_prefix: null; @@ -147,6 +155,17 @@ mixin Elm_Interface_Atspi_Accessible () domain: const(char)*; [[ translation domain ]] } } + @property type { + get { + [[Get type of accessibility object]] + } + set { + [[Set type of accessibility object]] + } + values { + type: Elm.Atspi.Type; + } + } relationship_append { [[Defines the relationship between two accessible objects. diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index c850e46..9e7e086 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -5860,31 +5860,48 @@ _elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Wid } EOLIAN static Eina_List* -_elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED) +_elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd) { Eina_List *l, *accs = NULL; - Elm_Widget_Smart_Data *wd; Evas_Object *widget; + Elm_Atspi_Type type; - wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS); - if (!wd) return NULL; - - EINA_LIST_FOREACH(wd->subobjs, l, widget) + EINA_LIST_FOREACH(pd->subobjs, l, widget) { if (!elm_object_widget_check(widget)) continue; - if (eo_isa(widget, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) - accs = eina_list_append(accs, widget); + if (!eo_isa(widget, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) continue; + eo_do(widget, type = elm_interface_atspi_accessible_type_get()); + if (type == ELM_ATSPI_TYPE_DISABLED) continue; + if (type == ELM_ATSPI_TYPE_SKIPPED) + { + Eina_List *children; + eo_do(widget, children = elm_interface_atspi_accessible_children_get()); + accs = eina_list_merge(accs, children); + continue; + } + accs = eina_list_append(accs, widget); } return accs; } EOLIAN static Eo* -_elm_widget_elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd) +_elm_widget_elm_interface_atspi_accessible_parent_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) { - Eo *ret; - eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_parent_get()); + Elm_Atspi_Type type; + Elm_Interface_Atspi_Accessible *parent; + + eo_do_super(obj, ELM_WIDGET_CLASS, parent = elm_interface_atspi_accessible_parent_get()); + if (parent) + return parent; + + parent = obj; + do { + ELM_WIDGET_DATA_GET_OR_RETURN(parent, wd, NULL); + parent = wd->parent_obj; + eo_do(parent, type = elm_interface_atspi_accessible_type_get()); + } while (parent && (type == ELM_ATSPI_TYPE_SKIPPED)); - return ret ? ret : pd->parent_obj; + return eo_isa(parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN) ? parent : NULL; } EOLIAN static Elm_Atspi_State_Set --