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

-- 


Reply via email to