On 10/05/2015 09:14 AM, Carsten Haitzler (The Rasterman) wrote:
> On Mon, 05 Oct 2015 09:06:36 +0200 Lukasz Stanislawski
> <[email protected]> said:
>
>> Hello,
>>
>> This API went in without proper adding tests. I will provide some during
>> stabilization phase.
>>
>> Sorry for inconvenience. If it unacceptable I will revert it and wait
>> for another cycle.
> maybe just mark as unstable in doxygen doc comments for now then? so people
> know... :)
API is already marked as beta, so I think it should be considered 
unstable :)
>
>> -------- Forwarded Message --------
>> Subject:     [EGIT] [core/elementary] master 01/01: atspi: add new
>> relationship append/remove/clear API
>> Date:        Mon, 05 Oct 2015 00:03:21 -0700
>> From:        Lukasz Stanislawski <[email protected]>
>> Reply-To:    Enlightenment developer list
>> <[email protected]>
>> To:  [email protected]
>>
>>
>>
>> stanluk pushed a commit to branch master.
>>
>> http://git.enlightenment.org/core/elementary.git/commit/?id=7158d62cb65edf2abf1da8ac0c50df6511d77d9b
>>
>> commit 7158d62cb65edf2abf1da8ac0c50df6511d77d9b
>> Author: Lukasz Stanislawski <[email protected]>
>> Date:   Sun Oct 4 22:30:31 2015 +0200
>>
>>       atspi: add new relationship append/remove/clear API
>>       
>>       Allow to add some extra contextul information about accessibility 
>> objects
>>       which can be used by Assistive Technology to provide better user
>> experience.
>>       API is still marked as beta.
>>       
>>       @feature
>> ---
>>    src/lib/elm_atspi_bridge.c                |  12 +-
>>    src/lib/elm_interface_atspi_accessible.c  | 180 
>> ++++++++++++++++++++++++++++
>> +- src/lib/elm_interface_atspi_accessible.eo |  38 ++++++-
>>    src/lib/elm_interface_atspi_accessible.h  |  39 ++++++-
>>    src/lib/elm_widget.c                      |  54 ++-------
>>    src/lib/elm_widget.eo                     |   1 -
>>    6 files changed, 270 insertions(+), 54 deletions(-)
>>
>> diff --git a/src/lib/elm_atspi_bridge.c b/src/lib/elm_atspi_bridge.c
>> index 9341153..b405655 100644
>> --- a/src/lib/elm_atspi_bridge.c
>> +++ b/src/lib/elm_atspi_bridge.c
>> @@ -786,11 +786,12 @@ _accessible_get_relation_set(const
>> Eldbus_Service_Interface *iface EINA_UNUSED, {
>>       const char *obj_path = eldbus_message_path_get(msg);
>>       Eo *bridge = eldbus_service_object_data_get(iface,
>> ELM_ATSPI_BRIDGE_CLASS_NAME);
>> -   Eo *obj = _bridge_object_from_path(bridge, obj_path);
>> +   Eo *rel_obj, *obj = _bridge_object_from_path(bridge, obj_path);
>>       Eldbus_Message *ret = NULL;
>>       Eldbus_Message_Iter *iter = NULL, *iter_array = NULL, *iter_array2 =
>> NULL, *iter_struct; Elm_Atspi_Relation *rel;
>> -   Eina_List *rels;
>> +   Eina_List *l, *l2;
>> +   Elm_Atspi_Relation_Set rels;
>>    
>>       ELM_ATSPI_OBJ_CHECK_OR_RETURN_DBUS_ERROR(obj,
>> ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, msg);
>> @@ -803,17 +804,18 @@ _accessible_get_relation_set(const
>> Eldbus_Service_Interface *iface EINA_UNUSED,
>>       eo_do(obj, rels = elm_interface_atspi_accessible_relation_set_get());
>>    
>> -   EINA_LIST_FREE(rels, rel)
>> +   EINA_LIST_FOREACH(rels, l, rel)
>>         {
>>            iter_struct = eldbus_message_iter_container_new(iter_array, 'r',
>> NULL); eldbus_message_iter_basic_append(iter_struct, 'u',
>> _elm_relation_to_atspi_relation(rel->type)); iter_array2 =
>> eldbus_message_iter_container_new(iter_struct, 'a', "(so)");
>> EINA_SAFETY_ON_NULL_GOTO(iter_array2, fail);
>> -        _bridge_iter_object_reference_append(bridge, iter_array2, rel->obj);
>> +        EINA_LIST_FOREACH(rel->objects, l2, rel_obj)
>> +           _bridge_iter_object_reference_append(bridge, iter_array2,
>> rel_obj); eldbus_message_iter_container_close(iter_struct, iter_array2);
>>            eldbus_message_iter_container_close(iter_array, iter_struct);
>> -        free(rel);
>>         }
>> +   elm_atspi_relation_set_free(rels);
>>       eldbus_message_iter_container_close(iter, iter_array);
>>    
>>       return ret;
>> diff --git a/src/lib/elm_interface_atspi_accessible.c
>> b/src/lib/elm_interface_atspi_accessible.c index 709d142..0c0a213 100644
>> --- a/src/lib/elm_interface_atspi_accessible.c
>> +++ b/src/lib/elm_interface_atspi_accessible.c
>> @@ -127,6 +127,7 @@ struct _Elm_Interface_Atspi_Accessible_Data
>>       const char    *name;
>>       const char    *description;
>>       const char    *translation_domain;
>> +   Elm_Atspi_Relation_Set relations;
>>       Elm_Interface_Atspi_Accessible *parent;
>>    };
>>    
>> @@ -290,12 +291,10 @@ _elm_interface_atspi_accessible_state_set_get(Eo *obj
>> EINA_UNUSED, Elm_Interface return 0;
>>    }
>>    
>> -EOLIAN Eina_List*
>> +EOLIAN Elm_Atspi_Relation_Set
>>    _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)));
>> -   return NULL;
>> +   return elm_atspi_relation_set_clone(pd->relations);
>>    }
>>    
>>    EAPI void elm_atspi_attributes_list_free(Eina_List *list)
>> @@ -369,4 +368,177 @@ _elm_interface_atspi_accessible_translation_domain_get
>> (Eo *obj EINA_UNUSED, Elm_ return pd->translation_domain;
>>    }
>>    
>> +EAPI void
>> +elm_atspi_relation_free(Elm_Atspi_Relation *relation)
>> +{
>> +   eina_list_free(relation->objects);
>> +   free(relation);
>> +}
>> +
>> +EAPI Elm_Atspi_Relation *
>> +elm_atspi_relation_clone(const Elm_Atspi_Relation *relation)
>> +{
>> +   Elm_Atspi_Relation *ret = calloc(sizeof(Elm_Atspi_Relation), 1);
>> +   if (!ret) return NULL;
>> +
>> +   ret->type = relation->type;
>> +   ret->objects = eina_list_clone(relation->objects);
>> +   return ret;
>> +}
>> +
>> +static Eina_Bool
>> +_on_rel_obj_del(void *data, Eo *obj, const Eo_Event_Description *desc
>> EINA_UNUSED, void *event_info EINA_UNUSED) +{
>> +   Elm_Atspi_Relation_Set *set = data;
>> +   Elm_Atspi_Relation *rel;
>> +   Eina_List *l, *l2, *p, *p2;
>> +   Eo *rel_obj;
>> +
>> +   EINA_LIST_FOREACH_SAFE(*set, l, l2, rel)
>> +     {
>> +        EINA_LIST_FOREACH_SAFE(rel->objects, p, p2, rel_obj)
>> +          {
>> +             if (rel_obj == obj)
>> +               rel->objects = eina_list_remove_list(rel->objects, p);
>> +          }
>> +        if (!rel->objects)
>> +          {
>> +             *set = eina_list_remove_list(*set, l);
>> +             free(rel);
>> +          }
>> +     }
>> +   return EINA_TRUE;
>> +}
>> +
>> +EAPI Eina_Bool
>> +elm_atspi_relation_set_relation_append(Elm_Atspi_Relation_Set *set,
>> Elm_Atspi_Relation_Type type, const Eo *rel_obj) +{
>> +   Elm_Atspi_Relation *rel;
>> +   Eina_List *l;
>> +
>> +   if (!eo_isa(rel_obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
>> +     return EINA_FALSE;
>> +
>> +   EINA_LIST_FOREACH(*set, l, rel)
>> +     {
>> +        if (rel->type == type)
>> +          {
>> +             if (!eina_list_data_find(rel->objects, rel_obj))
>> +               {
>> +                  rel->objects = eina_list_append(rel->objects, rel_obj);
>> +                  eo_do(rel_obj, eo_event_callback_add(EO_BASE_EVENT_DEL,
>> _on_rel_obj_del, set));
>> +               }
>> +             return EINA_TRUE;
>> +          }
>> +     }
>> +
>> +   rel = calloc(sizeof(Elm_Atspi_Relation), 1);
>> +   if (!rel) return EINA_FALSE;
>> +
>> +   rel->type = type;
>> +   rel->objects = eina_list_append(rel->objects, rel_obj);
>> +   *set = eina_list_append(*set, rel);
>> +
>> +   eo_do(rel_obj, eo_event_callback_add(EO_BASE_EVENT_DEL, _on_rel_obj_del,
>> set));
>> +   return EINA_TRUE;
>> +}
>> +
>> +EAPI void
>> +elm_atspi_relation_set_relation_remove(Elm_Atspi_Relation_Set *set,
>> Elm_Atspi_Relation_Type type, const Eo *rel_obj) +{
>> +   Eina_List *l;
>> +   Elm_Atspi_Relation *rel;
>> +
>> +   EINA_LIST_FOREACH(*set, l, rel)
>> +     {
>> +        if (rel->type == type)
>> +          {
>> +             if (eina_list_data_find(rel->objects, rel_obj))
>> +               {
>> +                  eo_do(rel_obj, eo_event_callback_del(EO_BASE_EVENT_DEL,
>> _on_rel_obj_del, set));
>> +                  rel->objects = eina_list_remove(rel->objects, rel_obj);
>> +               }
>> +             if (!rel->objects)
>> +               {
>> +                  *set = eina_list_remove(*set, rel);
>> +                  elm_atspi_relation_free(rel);
>> +               }
>> +             return;
>> +          }
>> +     }
>> +}
>> +
>> +EAPI void
>> +elm_atspi_relation_set_relation_type_remove(Elm_Atspi_Relation_Set *set,
>> Elm_Atspi_Relation_Type type) +{
>> +   Eina_List *l;
>> +   Elm_Atspi_Relation *rel;
>> +   Eo *obj;
>> +
>> +   EINA_LIST_FOREACH(*set, l, rel)
>> +     {
>> +        if (rel->type == type)
>> +          {
>> +             EINA_LIST_FOREACH(rel->objects, l, obj)
>> +                eo_do(obj, eo_event_callback_del(EO_BASE_EVENT_DEL,
>> _on_rel_obj_del, set));
>> +             *set = eina_list_remove(*set, rel);
>> +             elm_atspi_relation_free(rel);
>> +             return;
>> +          }
>> +     }
>> +}
>> +
>> +EAPI void
>> +elm_atspi_relation_set_free(Elm_Atspi_Relation_Set set)
>> +{
>> +   Elm_Atspi_Relation *rel;
>> +   Eina_List *l;
>> +   Eo *obj;
>> +
>> +   EINA_LIST_FREE(set, rel)
>> +     {
>> +        EINA_LIST_FOREACH(rel->objects, l, obj)
>> +           eo_do(obj, eo_event_callback_del(EO_BASE_EVENT_DEL,
>> _on_rel_obj_del, set));
>> +        elm_atspi_relation_free(rel);
>> +     }
>> +}
>> +
>> +EAPI Elm_Atspi_Relation_Set
>> +elm_atspi_relation_set_clone(const Elm_Atspi_Relation_Set set)
>> +{
>> +   Elm_Atspi_Relation_Set ret = NULL;
>> +   Eina_List *l;
>> +   Elm_Atspi_Relation *rel;
>> +
>> +   EINA_LIST_FOREACH(set, l, rel)
>> +     {
>> +        Elm_Atspi_Relation *cpy = elm_atspi_relation_clone(rel);
>> +        ret = eina_list_append(ret, cpy);
>> +     }
>> +
>> +   return ret;
>> +}
>> +
>> +EOLIAN static Eina_Bool
>> +_elm_interface_atspi_accessible_relationship_append(Eo *obj EINA_UNUSED,
>> Elm_Interface_Atspi_Accessible_Data *sd, Elm_Atspi_Relation_Type type, const
>> Elm_Interface_Atspi_Accessible *relation_obj) +{
>> +   return elm_atspi_relation_set_relation_append(&sd->relations, type,
>> relation_obj); +}
>> +
>> +EOLIAN static void
>> +_elm_interface_atspi_accessible_relationship_remove(Eo *obj EINA_UNUSED,
>> Elm_Interface_Atspi_Accessible_Data *sd, Elm_Atspi_Relation_Type type, const
>> Elm_Interface_Atspi_Accessible *relation_obj) +{
>> +   if (relation_obj)
>> +     elm_atspi_relation_set_relation_remove(&sd->relations, type,
>> relation_obj);
>> +   else
>> +     elm_atspi_relation_set_relation_type_remove(&sd->relations, type);
>> +}
>> +
>> +EOLIAN static void
>> +_elm_interface_atspi_accessible_relationships_clear(Eo *obj EINA_UNUSED,
>> Elm_Interface_Atspi_Accessible_Data *sd) +{
>> +   elm_atspi_relation_set_free(sd->relations);
>> +   sd->relations = NULL;
>> +}
>> +
>>    #include "elm_interface_atspi_accessible.eo.c"
>> diff --git a/src/lib/elm_interface_atspi_accessible.eo
>> b/src/lib/elm_interface_atspi_accessible.eo index f6a4ed7..65b6b95 100644
>> --- a/src/lib/elm_interface_atspi_accessible.eo
>> +++ b/src/lib/elm_interface_atspi_accessible.eo
>> @@ -27,7 +27,7 @@ mixin Elm_Interface_Atspi_Accessible ()
>>                [[Gets an string describing ATSPI widget role name. Lists and
>> elements Should be free by a user.]] }
>>             values {
>> -            relations: own(list<own(Elm_Atspi_Relation *)> *);
>> +            relations: Elm_Atspi_Relation_Set;
>>             }
>>          }
>>          @property role @protected {
>> @@ -147,6 +147,42 @@ mixin Elm_Interface_Atspi_Accessible ()
>>                domain: const(char)*; [[ translation domain ]]
>>             }
>>          }
>> +      relationship_append @protected {
>> +         [[Defines the relationship between two accessible objects.
>> +
>> +           Adds unique relation between source object and relation_object of
>> a
>> +           given type.
>> +
>> +           Relationships can be queried by Assistive Technology clients to
>> +           provide customized feedback, improving overall user experience.
>> +
>> +           Relationship_append API is asymmetric, which means that
>> +           appending, for example, relation ELM_ATSPI_RELATION_FLOWS_TO from
>> object A to B,
>> +           do NOT append relation ELM_ATSPI_RELATION_FLOWS_FROM from object
>> B to
>> +           object A.
>> +
>> +           return: EINA_TRUE is relationship was successfully appended,
>> EINA_FALSE
>> +           otherwise]]
>> +         return: bool;
>> +         params {
>> +            @in type: Elm_Atspi_Relation_Type;
>> +            @in relation_object: const(Elm_Interface_Atspi_Accessible)*;
>> +         }
>> +      }
>> +      relationship_remove @protected {
>> +         [[Removes the relationship between two accessible objects.
>> +
>> +          If relation_object is NULL function removes all relations
>> +          of given type.
>> +         ]]
>> +         params {
>> +            @in type: Elm_Atspi_Relation_Type;
>> +            @in relation_object: const(Elm_Interface_Atspi_Accessible)*;
>> +         }
>> +      }
>> +      relationships_clear @protected {
>> +         [[Removes all relationships in accessible object.]]
>> +      }
>>       }
>>       events {
>>          property,changed: const(char)*;
>> diff --git a/src/lib/elm_interface_atspi_accessible.h
>> b/src/lib/elm_interface_atspi_accessible.h index 0012caa..8ebe244 100644
>> --- a/src/lib/elm_interface_atspi_accessible.h
>> +++ b/src/lib/elm_interface_atspi_accessible.h
>> @@ -252,7 +252,7 @@ typedef struct _Elm_Atspi_Attribute Elm_Atspi_Attribute;
>>    struct _Elm_Atspi_Relation
>>    {
>>       Elm_Atspi_Relation_Type type;
>> -   const Eo *obj;
>> +   Eina_List *objects;
>>    };
>>    
>>    typedef struct _Elm_Atspi_Relation Elm_Atspi_Relation;
>> @@ -262,6 +262,43 @@ typedef struct _Elm_Atspi_Relation Elm_Atspi_Relation;
>>     */
>>    EAPI void elm_atspi_attributes_list_free(Eina_List *list);
>>    
>> +typedef Eina_List *Elm_Atspi_Relation_Set;
>> +
>> +/**
>> + * Frees relation.
>> + */
>> +EAPI void elm_atspi_relation_free(Elm_Atspi_Relation *relation);
>> +
>> +/**
>> + * Clones relation.
>> + */
>> +EAPI Elm_Atspi_Relation * elm_atspi_relation_clone(const Elm_Atspi_Relation
>> *relation); +
>> +/**
>> + * Appends relation to relation set
>> + */
>> +EAPI Eina_Bool elm_atspi_relation_set_relation_append(Elm_Atspi_Relation_Set
>> *set, Elm_Atspi_Relation_Type type, const Eo *rel_obj); +
>> +/**
>> + * Removes relation from relation set
>> + */
>> +EAPI void elm_atspi_relation_set_relation_remove(Elm_Atspi_Relation_Set
>> *set, Elm_Atspi_Relation_Type type, const Eo *rel_obj); +
>> +/**
>> + * Removes all relation from relation set of a given type
>> + */
>> +EAPI void elm_atspi_relation_set_relation_type_remove(Elm_Atspi_Relation_Set
>> *set, Elm_Atspi_Relation_Type type); +
>> +/**
>> + * Frees Elm_Atspi_Relation_Set
>> + */
>> +EAPI void elm_atspi_relation_set_free(Elm_Atspi_Relation_Set set);
>> +
>> +/**
>> + * Clones Elm_Atspi_Relation_Set
>> + */
>> +EAPI Elm_Atspi_Relation_Set elm_atspi_relation_set_clone(const
>> Elm_Atspi_Relation_Set set); +
>>    #ifdef EFL_EO_API_SUPPORT
>>    
>>    /**
>> diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
>> index 73d024a..4a9022f 100644
>> --- a/src/lib/elm_widget.c
>> +++ b/src/lib/elm_widget.c
>> @@ -4431,9 +4431,12 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item,
>> Elm_Widget_Item_Data *item) }
>>       eina_hash_free(item->labels);
>>    
>> -   eo_do(eo_item, elm_interface_atspi_accessible_description_set(NULL));
>> -   eo_do(eo_item, elm_interface_atspi_accessible_name_set(NULL));
>> -   eo_do(eo_item, elm_interface_atspi_accessible_translation_domain_set
>> (NULL));
>> +   eo_do(eo_item,
>> +         elm_interface_atspi_accessible_description_set(NULL),
>> +         elm_interface_atspi_accessible_name_set(NULL),
>> +         elm_interface_atspi_accessible_translation_domain_set(NULL),
>> +         elm_interface_atspi_accessible_relationships_clear()
>> +         );
>>    
>>       if (_elm_config->atspi_mode && item->widget)
>>         elm_interface_atspi_accessible_children_changed_del_signal_emit
>> (item->widget, eo_item); @@ -5706,9 +5709,12 @@
>> _elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd
>> EINA_UNUSED) EOLIAN static void _elm_widget_eo_base_destructor(Eo *obj,
>> Elm_Widget_Smart_Data *sd EINA_UNUSED) {
>> -   eo_do(obj, elm_interface_atspi_accessible_description_set(NULL));
>> -   eo_do(obj, elm_interface_atspi_accessible_name_set(NULL));
>> -   eo_do(obj, elm_interface_atspi_accessible_translation_domain_set(NULL));
>> +   eo_do(obj,
>> +         elm_interface_atspi_accessible_description_set(NULL),
>> +         elm_interface_atspi_accessible_name_set(NULL),
>> +         elm_interface_atspi_accessible_translation_domain_set(NULL),
>> +         elm_interface_atspi_accessible_relationships_clear()
>> +         );
>>       elm_interface_atspi_accessible_removed(obj);
>>    
>>       eo_do_super(obj, ELM_WIDGET_CLASS, eo_destructor());
>> @@ -5881,42 +5887,6 @@
>> _elm_widget_elm_interface_atspi_accessible_attributes_get(Eo *obj,
>> Elm_Widget_Sm return ret; }
>>    
>> -static Elm_Atspi_Relation*
>> -_relation_new(Elm_Atspi_Relation_Type type, Eo *obj)
>> -{
>> -   Elm_Atspi_Relation *rel = calloc(1, sizeof(Elm_Atspi_Relation));
>> -   if (!rel) return NULL;
>> -
>> -   rel->type = type;
>> -   rel->obj = obj;
>> -
>> -   return rel;
>> -}
>> -
>> -EOLIAN static Eina_List*
>> -_elm_widget_elm_interface_atspi_accessible_relation_set_get(Eo *obj,
>> Elm_Widget_Smart_Data *pd EINA_UNUSED) -{
>> -   Eina_List *list = NULL;
>> -   Elm_Atspi_Relation *rel;
>> -   Evas_Object *rel_obj;
>> -
>> -   rel_obj = elm_object_focus_next_object_get(obj, ELM_FOCUS_NEXT);
>> -   if (eo_isa(rel_obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
>> -     {
>> -        rel = _relation_new(ELM_ATSPI_RELATION_FLOWS_TO, rel_obj);
>> -        list = eina_list_append(list, rel);
>> -     }
>> -
>> -   rel_obj = elm_object_focus_next_object_get(obj, ELM_FOCUS_PREVIOUS);
>> -   if (eo_isa(rel_obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
>> -     {
>> -        rel = _relation_new(ELM_ATSPI_RELATION_FLOWS_FROM, rel_obj);
>> -        list = eina_list_append(list, rel);
>> -     }
>> -
>> -   return list;
>> -}
>> -
>>    EOLIAN static void
>>    _elm_widget_item_elm_interface_atspi_component_extents_get(Eo *obj
>> EINA_UNUSED, Elm_Widget_Item_Data *sd EINA_UNUSED, Eina_Bool screen_coords,
>> int *x, int *y, int *w, int *h) { diff --git a/src/lib/elm_widget.eo
>> b/src/lib/elm_widget.eo index f53d2c4..35bed55 100644
>> --- a/src/lib/elm_widget.eo
>> +++ b/src/lib/elm_widget.eo
>> @@ -771,7 +771,6 @@ abstract Elm.Widget (Evas.Object_Smart,
>> Elm_Interface_Atspi_Accessible, Elm_Inte
>> Elm_Interface_Atspi_Accessible.children.get;
>> Elm_Interface_Atspi_Accessible.parent.get;
>> Elm_Interface_Atspi_Accessible.attributes.get;
>> -      Elm_Interface_Atspi_Accessible.relation_set.get;
>>          Elm_Interface_Atspi_Component.focus_grab;
>>       }
>>       events {
>>
>> -- 
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> enlightenment-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>>
>


------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to