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
This commit is contained in:
Lukasz Stanislawski 2015-11-26 16:53:32 +01:00
parent 8d92d32676
commit cf7323ef9a
4 changed files with 95 additions and 15 deletions

View File

@ -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);
}

View File

@ -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"

View File

@ -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.

View File

@ -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;
return ret ? ret : pd->parent_obj;
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 eo_isa(parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN) ? parent : NULL;
}
EOLIAN static Elm_Atspi_State_Set