atspi: encapsulate common behaviour in atspi mixin class.

This patch moves some duplicated implementation from elm_widget
and elm_widget_item classes into atspi base mixin. It allows to
better share code and reduce maintainability.

Change-Id: I8d264661e7ffade7da72299f29075a536d71eaa3
This commit is contained in:
Lukasz Stanislawski 2015-10-01 17:24:42 +02:00
parent 6606ad372a
commit ca134076eb
6 changed files with 58 additions and 129 deletions

View File

@ -121,10 +121,21 @@ struct _Elm_Atspi_Event_Handler
void *data;
};
struct _Elm_Interface_Atspi_Accessible_Data
{
Elm_Atspi_Role role;
const char *name;
const char *description;
Elm_Interface_Atspi_Accessible *parent;
};
typedef struct _Elm_Interface_Atspi_Accessible_Data Elm_Interface_Atspi_Accessible_Data;
static Eina_List *global_callbacks;
EOLIAN static int
_elm_interface_atspi_accessible_index_in_parent_get(Eo *obj, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_index_in_parent_get(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
Eina_List *l, *children = NULL;
Eo *chld, *parent = NULL;
@ -151,27 +162,24 @@ _elm_interface_atspi_accessible_index_in_parent_get(Eo *obj, void *pd EINA_UNUSE
return ret;
}
EOLIAN static Eo *
_elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
EOLIAN static Elm_Interface_Atspi_Accessible *
_elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd)
{
Eo *parent = NULL;
/* By default using Eo_Base object hierarchy */
eo_do(obj, parent = eo_parent_get());
if (!parent) return NULL;
return eo_isa(parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN) ? parent : NULL;
return pd->parent;
}
EOLIAN static void
_elm_interface_atspi_accessible_parent_set(Eo *obj, void *priv EINA_UNUSED, Eo *new_parent EINA_UNUSED)
_elm_interface_atspi_accessible_parent_set(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd, Elm_Interface_Atspi_Accessible *new_parent)
{
WRN("The %s object does not implement the \"accessible_parent_set\" function.",
eo_class_name_get(eo_class_get(obj)));
if (pd->parent != new_parent)
{
pd->parent = new_parent;
elm_interface_atspi_accessible_parent_changed_signal_emit(obj);
}
}
EOLIAN Eina_List*
_elm_interface_atspi_accessible_attributes_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_attributes_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
WRN("The %s object does not implement the \"accessible_attributes_set\" function.",
eo_class_name_get(eo_class_get(obj)));
@ -179,20 +187,23 @@ _elm_interface_atspi_accessible_attributes_get(Eo *obj EINA_UNUSED, void *pd EIN
}
EOLIAN static Elm_Atspi_Role
_elm_interface_atspi_accessible_role_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_role_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
return ELM_ATSPI_ROLE_UNKNOWN;
return pd->role;
}
EOLIAN static void
_elm_interface_atspi_accessible_role_set(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Elm_Atspi_Role role EINA_UNUSED)
_elm_interface_atspi_accessible_role_set(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED, Elm_Atspi_Role role)
{
WRN("The %s object does not implement the \"accessible_role_set\" function.",
eo_class_name_get(eo_class_get(obj)));
if (pd->role != role)
{
pd->role = role;
elm_interface_atspi_accessible_role_changed_signal_emit(obj);
}
}
EOLIAN const char *
_elm_interface_atspi_accessible_role_name_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_role_name_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
Elm_Atspi_Role role;
@ -202,36 +213,30 @@ _elm_interface_atspi_accessible_role_name_get(Eo *obj EINA_UNUSED, void *pd EINA
}
EOLIAN char *
_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd)
{
WRN("The %s object does not implement the \"accessible_name_get\" function.",
eo_class_name_get(eo_class_get(obj)));
return NULL;
return pd->name ? strdup(pd->name) : NULL;
}
EOLIAN static void
_elm_interface_atspi_accessible_name_set(Eo *obj, void *pd EINA_UNUSED, char *val EINA_UNUSED)
_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd, char *val)
{
WRN("The %s object does not implement the \"accessible_name_set\" function.",
eo_class_name_get(eo_class_get(obj)));
eina_stringshare_replace(&pd->name, val);
}
const char * _elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
const char * _elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd)
{
WRN("The %s object does not implement the \"accessible_description_get\" function.",
eo_class_name_get(eo_class_get(obj)));
return NULL;
return pd->description;
}
EOLIAN static void
_elm_interface_atspi_accessible_description_set(Eo *obj, void *pd EINA_UNUSED, const char *val EINA_UNUSED)
_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd, const char *val)
{
WRN("The %s object does not implement the \"accessible_description_set\" function.",
eo_class_name_get(eo_class_get(obj)));
eina_stringshare_replace(&pd->description, val);
}
EOLIAN static const char *
_elm_interface_atspi_accessible_localized_role_name_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_localized_role_name_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
const char *ret = NULL;
eo_do(obj, ret = elm_interface_atspi_accessible_role_name_get());
@ -242,7 +247,7 @@ _elm_interface_atspi_accessible_localized_role_name_get(Eo *obj EINA_UNUSED, voi
}
EOLIAN static Eina_List *
_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
Eina_List *children = NULL;
Eina_Iterator *iter = NULL;
@ -263,14 +268,13 @@ _elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, void *pd EINA_
}
EOLIAN static Elm_Atspi_State_Set
_elm_interface_atspi_accessible_state_set_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_state_set_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
Elm_Atspi_State_Set ret = 0;
return ret;
return 0;
}
EOLIAN Eina_List*
_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UNUSED, Elm_Interface_Atspi_Accessible_Data *pd EINA_UNUSED)
{
WRN("The %s object does not implement the \"accessible_relation_set\" function.",
eo_class_name_get(eo_class_get(obj)));

View File

@ -2,7 +2,7 @@ mixin Elm_Interface_Atspi_Accessible ()
{
legacy_prefix: null;
eo_prefix: elm_interface_atspi_accessible;
data: null;
data: Elm_Interface_Atspi_Accessible_Data;
methods {
@property localized_role_name @protected {
get {
@ -45,7 +45,7 @@ mixin Elm_Interface_Atspi_Accessible ()
[[Gets widget's accessible children.]]
}
values {
children: free(own(list<Eo *> *), eina_list_free);
children: free(own(list<Elm_Interface_Atspi_Accessible *> *), eina_list_free);
}
}
@property role_name @protected {
@ -91,7 +91,7 @@ mixin Elm_Interface_Atspi_Accessible ()
[[Sets widget accessible parent.]]
}
values {
parent: Eo *;
parent: Elm_Interface_Atspi_Accessible *;
}
}
@property state_set @protected {
@ -118,7 +118,7 @@ mixin Elm_Interface_Atspi_Accessible ()
}
event_emit @class @protected {
params {
@in accessible: Eo*; [[Accessibility object.]]
@in accessible: Elm_Interface_Atspi_Accessible *; [[Accessibility object.]]
@in event: const(Eo_Event_Description)*; [[Accessibility event type.]]
@in event_info: void*; [[Accessibility event details.]]
}

View File

@ -4431,8 +4431,8 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item, Elm_Widget_Item_Data *item)
}
eina_hash_free(item->labels);
if (item->description)
eina_stringshare_del(item->description);
eo_do(eo_item, elm_interface_atspi_accessible_description_set(NULL));
eo_do(eo_item, elm_interface_atspi_accessible_name_set(NULL));
if (_elm_config->atspi_mode)
elm_interface_atspi_accessible_children_changed_del_signal_emit(item->widget, eo_item);
@ -4561,34 +4561,6 @@ _elm_widget_item_widget_get(const Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data
return item->widget;
}
EOLIAN static const char*
_elm_widget_item_elm_interface_atspi_accessible_description_get(Eo *eo_item EINA_UNUSED,
Elm_Widget_Item_Data *item)
{
return item->description;
}
EOLIAN static void
_elm_widget_item_elm_interface_atspi_accessible_description_set(Eo *eo_item EINA_UNUSED,
Elm_Widget_Item_Data *item,
const char *descr)
{
eina_stringshare_replace(&item->description, descr);
}
EOLIAN static Elm_Atspi_Role
_elm_widget_item_elm_interface_atspi_accessible_role_get(Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data *item)
{
return item->role;
}
EOLIAN static void
_elm_widget_item_elm_interface_atspi_accessible_role_set(Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data *item,
Elm_Atspi_Role role)
{
item->role = role;
}
EAPI Eina_Bool
_elm_widget_onscreen_is(Evas_Object *widget)
{
@ -5713,7 +5685,7 @@ elm_widget_tree_dot_dump(const Evas_Object *top,
}
EOLIAN static Eo *
_elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd)
_elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED)
{
Eo *parent = NULL;
@ -5726,15 +5698,15 @@ _elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd)
eo_do(obj, elm_obj_widget_parent_set(parent));
sd->on_create = EINA_FALSE;
sd->role = ELM_ATSPI_ROLE_UNKNOWN;
eo_do(obj, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_UNKNOWN));
return obj;
}
EOLIAN static void
_elm_widget_eo_base_destructor(Eo *obj, Elm_Widget_Smart_Data *sd)
_elm_widget_eo_base_destructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED)
{
if (sd->description) eina_stringshare_del(sd->description);
eo_do(obj, elm_interface_atspi_accessible_description_set(NULL));
eo_do(obj, elm_interface_atspi_accessible_name_set(NULL));
elm_interface_atspi_accessible_removed(obj);
eo_do_super(obj, ELM_WIDGET_CLASS, eo_destructor());
@ -5836,30 +5808,6 @@ _elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Wid
return _elm_util_mkup_to_text(ret);
}
EOLIAN static const char*
_elm_widget_elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd)
{
return _pd->description;
}
EOLIAN static void
_elm_widget_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd, const char *descr)
{
eina_stringshare_replace(&_pd->description, descr);
}
EOLIAN static Elm_Atspi_Role
_elm_widget_elm_interface_atspi_accessible_role_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
return pd->role;
}
EOLIAN static void
_elm_widget_elm_interface_atspi_accessible_role_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd, Elm_Atspi_Role role)
{
pd->role = role;
}
EOLIAN static Eina_List*
_elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
@ -5882,16 +5830,10 @@ _elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm
EOLIAN static Eo*
_elm_widget_elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd)
{
if (pd->atspi_custom_parent)
return pd->atspi_custom_parent;
else
return pd->parent_obj;
}
Eo *ret;
eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_parent_get());
EOLIAN static void
_elm_widget_elm_interface_atspi_accessible_parent_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd, Eo *parent)
{
pd->atspi_custom_parent = parent;
return ret ? ret : pd->parent_obj;
}
EOLIAN static Elm_Atspi_State_Set

View File

@ -767,14 +767,9 @@ abstract Elm.Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte
@virtual .focus_next;
@virtual .parent_widget.get;
Elm_Interface_Atspi_Accessible.name.get;
Elm_Interface_Atspi_Accessible.description.get;
Elm_Interface_Atspi_Accessible.description.set;
Elm_Interface_Atspi_Accessible.role.get;
Elm_Interface_Atspi_Accessible.role.set;
Elm_Interface_Atspi_Accessible.state_set.get;
Elm_Interface_Atspi_Accessible.children.get;
Elm_Interface_Atspi_Accessible.parent.get;
Elm_Interface_Atspi_Accessible.parent.set;
Elm_Interface_Atspi_Accessible.attributes.get;
Elm_Interface_Atspi_Accessible.relation_set.get;
Elm_Interface_Atspi_Component.focus_grab;

View File

@ -411,10 +411,6 @@ typedef struct _Elm_Widget_Smart_Data
Eina_List *focus_chain;
Eina_List *event_cb;
int role; /**< Accessibility role */
const char *description; /**< Accessibility description */
Eo *atspi_custom_parent; /**< Accessibility parent if different then parent_obj */
/* this is a hook to be set on-the-fly on widgets. this is code
* handling the request of showing a specific region from an inner
* widget (mainly issued by entries, on cursor moving) */
@ -625,10 +621,6 @@ struct _Elm_Widget_Item_Data
Eina_Hash *labels;
Evas_Object *track_obj;
/**< A11Y info */
const char *description;
int role;
Eina_Bool disabled : 1;
Eina_Bool on_deletion : 1;
Eina_Bool on_translate : 1;

View File

@ -529,10 +529,6 @@ class Elm.Widget_Item(Eo.Base, Elm_Interface_Atspi_Accessible,
implements {
Eo.Base.constructor;
Eo.Base.destructor;
Elm_Interface_Atspi_Accessible.description.get;
Elm_Interface_Atspi_Accessible.description.set;
Elm_Interface_Atspi_Accessible.role.get;
Elm_Interface_Atspi_Accessible.role.set;
Elm_Interface_Atspi_Accessible.state_set.get;
Elm_Interface_Atspi_Accessible.parent.get;
Elm_Interface_Atspi_Component.extents.get;