atspi: encapsulate common behaviour in atspi mixin class.
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Thu, 1 Oct 2015 15:24:42 +0000 (17:24 +0200)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Fri, 2 Oct 2015 09:32:04 +0000 (11:32 +0200)
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

legacy/elementary/src/lib/elm_interface_atspi_accessible.c
legacy/elementary/src/lib/elm_interface_atspi_accessible.eo
legacy/elementary/src/lib/elm_widget.c
legacy/elementary/src/lib/elm_widget.eo
legacy/elementary/src/lib/elm_widget.h
legacy/elementary/src/lib/elm_widget_item.eo

index 3524008..5bfb80e 100644 (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)));
index 3672b02..98e02ad 100644 (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.]]
          }
index 6bc1ccb..a8f5174 100644 (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
index f171e90..f53d2c4 100644 (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;
index 77c7059..9f570a9 100644 (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;
index 48f4e44..9953bc8 100644 (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;