forked from enlightenment/efl
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:
parent
8d92d32676
commit
cf7323ef9a
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue