stanluk pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=7defa24fd074bd8cd35318c7707acf4fbce69c44
commit 7defa24fd074bd8cd35318c7707acf4fbce69c44 Author: Lukasz Stanislawski <l.stanisl...@samsung.com> Date: Thu Oct 1 17:24:42 2015 +0200 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 --- src/lib/elm_interface_atspi_accessible.c | 84 ++++++++++++++++--------------- src/lib/elm_interface_atspi_accessible.eo | 8 +-- src/lib/elm_widget.c | 78 ++++------------------------ src/lib/elm_widget.eo | 5 -- src/lib/elm_widget.h | 8 --- src/lib/elm_widget_item.eo | 4 -- 6 files changed, 58 insertions(+), 129 deletions(-) diff --git a/src/lib/elm_interface_atspi_accessible.c b/src/lib/elm_interface_atspi_accessible.c index 3524008..5bfb80e 100644 --- a/src/lib/elm_interface_atspi_accessible.c +++ b/src/lib/elm_interface_atspi_accessible.c @@ -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))); diff --git a/src/lib/elm_interface_atspi_accessible.eo b/src/lib/elm_interface_atspi_accessible.eo index 3672b02..98e02ad 100644 --- a/src/lib/elm_interface_atspi_accessible.eo +++ b/src/lib/elm_interface_atspi_accessible.eo @@ -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.]] } diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index 6bc1ccb..a8f5174 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -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 diff --git a/src/lib/elm_widget.eo b/src/lib/elm_widget.eo index f171e90..f53d2c4 100644 --- a/src/lib/elm_widget.eo +++ b/src/lib/elm_widget.eo @@ -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; diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h index 77c7059..9f570a9 100644 --- a/src/lib/elm_widget.h +++ b/src/lib/elm_widget.h @@ -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; diff --git a/src/lib/elm_widget_item.eo b/src/lib/elm_widget_item.eo index 48f4e44..9953bc8 100644 --- a/src/lib/elm_widget_item.eo +++ b/src/lib/elm_widget_item.eo @@ -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; --