this looks surprisingly useful

On Thu, Sep 5, 2013 at 9:17 AM, Cedric Bail - Enlightenment Git <
[email protected]> wrote:

> cedric pushed a commit to branch master.
>
> commit a626a91d69d67199e077c138648183e896f1cc1e
> Author: Cedric Bail <[email protected]>
> Date:   Thu Sep 5 17:15:58 2013 +0900
>
>     evas: add evas_object_smart_iterator_new().
>
>     This is going to break Eo ABI. Rebuild all software using Eo API on top
>     of EFL (Elementary for example).
> ---
>  ChangeLog                               |  4 ++
>  NEWS                                    |  1 +
>  src/lib/evas/Evas_Eo.h                  | 16 +++++++
>  src/lib/evas/Evas_Legacy.h              | 16 +++++++
>  src/lib/evas/canvas/evas_object_smart.c | 82
> +++++++++++++++++++++++++++++++++
>  5 files changed, 119 insertions(+)
>
> diff --git a/ChangeLog b/ChangeLog
> index 27c321a..f115014 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,7 @@
> +2013-09-05  Cedric Bail
> +
> +       * Evas: Add evas_object_smart_iterator_new().
> +
>  2013-09-04  Michael Bouchaud (yoz)
>
>          * fix edje_object_scale_set to be recursive
> diff --git a/NEWS b/NEWS
> index 1da60c2..0794a9e 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -209,6 +209,7 @@ Improvements:
>       - Asynchronous preload of GL texture.
>       - Add neon assembly for upscaling and map routines
>       - Use mmap/munmap for image data allocation on system that have mmap.
> +     - Add iterator for walking child of smart objects, table and a box.
>      * Ecore_Con:
>       - Rebase dns.c against upstream
>      * Edje:
> diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
> index e4b83e8..2324831 100644
> --- a/src/lib/evas/Evas_Eo.h
> +++ b/src/lib/evas/Evas_Eo.h
> @@ -2978,6 +2978,7 @@ enum
>     EVAS_OBJ_SMART_SUB_ID_MEMBER_ADD,
>     EVAS_OBJ_SMART_SUB_ID_MEMBER_DEL,
>     EVAS_OBJ_SMART_SUB_ID_MEMBERS_GET,
> +   EVAS_OBJ_SMART_SUB_ID_ITERATOR_NEW,
>     EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_SET,
>     EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_GET,
>     EVAS_OBJ_SMART_SUB_ID_CALLBACK_DESCRIPTION_FIND,
> @@ -3059,10 +3060,25 @@ enum
>   * @param[out] list out
>   *
>   * @see evas_object_smart_members_get
> + * @see evas_object_smart_iterator_new
>   */
>  #define evas_obj_smart_members_get(list)
> EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MEMBERS_GET),
> EO_TYPECHECK(Eina_List **, list)
>
>  /**
> + * @def evas_obj_smart_iterator_new
> + * @since 1.8
> + *
> + * Retrieves an iterator of the member objects of a given Evas smart
> + * object
> + *
> + * @param[out] iterator out
> + *
> + * @see evas_object_smart_iterator_new
> + * @see evas_object_smart_members_get
> + */
> +#define evas_obj_smart_iterator_new(it)
> EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ITERATOR_NEW),
> EO_TYPECHECK(Eina_Iterator **, it)
> +
> +/**
>   * @def evas_obj_smart_callback_priority_add
>   * @since 1.8
>   *
> diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h
> index 25fec60..5294ce7 100644
> --- a/src/lib/evas/Evas_Legacy.h
> +++ b/src/lib/evas/Evas_Legacy.h
> @@ -6322,10 +6322,26 @@ EAPI void
> evas_object_smart_member_del(Evas_Object *obj) EINA_ARG_NONNUL
>   *
>   * @see evas_object_smart_member_add()
>   * @see evas_object_smart_member_del()
> + * @see evas_object_smart_iterator_new()
>   */
>  EAPI Eina_List   *evas_object_smart_members_get(const Evas_Object *obj)
> EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
>
>  /**
> + * Retrieves an iterator of the member objects of a given Evas smart
> + * object
> + *
> + * @param obj the smart object to get members from
> + * @return Returns the iterator of the member objects of @p obj.
> + *
> + * @since 1.8
> + *
> + * @see evas_object_smart_member_add()
> + * @see evas_object_smart_member_del()
> + * @see evas_object_smart_members_get()
> + */
> +EAPI Eina_Iterator   *evas_object_smart_iterator_new(const Evas_Object
> *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
> +
> +/**
>   * Gets the parent smart object of a given Evas object, if it has one.
>   *
>   * @param obj the Evas object you want to get the parent smart object
> diff --git a/src/lib/evas/canvas/evas_object_smart.c
> b/src/lib/evas/canvas/evas_object_smart.c
> index 8b1d885..f3f2631 100644
> --- a/src/lib/evas/canvas/evas_object_smart.c
> +++ b/src/lib/evas/canvas/evas_object_smart.c
> @@ -51,6 +51,16 @@ typedef struct
>     _Evas_Event_Description *desc;
>  } _eo_evas_smart_cb_info;
>
> +
> +typedef struct _Evas_Object_Smart_Iterator Evas_Object_Smart_Iterator;
> +struct _Evas_Object_Smart_Iterator
> +{
> +   Eina_Iterator iterator;
> +
> +   const Eina_Inlist *current;
> +   Evas_Object *parent;
> +};
> +
>  static Eina_Bool
>  _eo_evas_smart_cb(void *data, Eo *eo_obj, const Eo_Event_Description
> *desc EINA_UNUSED, void *event_info)
>  {
> @@ -447,6 +457,76 @@ evas_smart_legacy_type_register(const char *type,
> const Eo_Class *klass)
>     eina_hash_set(_evas_smart_class_names_hash_table, type, klass);
>  }
>
> +static Eina_Bool
> +_evas_object_smart_iterator_next(Evas_Object_Smart_Iterator *it, void
> **data)
> +{
> +   Evas_Object *eo;
> +
> +   if (!it->current) return EINA_FALSE;
> +
> +   eo = ((const Evas_Object_Protected_Data*)(it->current))->object;
> +   if (data) *data = eo;
> +
> +   it->current = it->current->next;
> +
> +   return EINA_TRUE;
> +}
> +
> +static Evas_Object *
> +_evas_object_smart_iterator_get_container(Evas_Object_Smart_Iterator *it)
> +{
> +   return it->parent;
> +}
> +
> +static void
> +_evas_object_smart_iterator_free(Evas_Object_Smart_Iterator *it)
> +{
> +   eo_unref(it->parent);
> +   free(it);
> +}
> +
> +// Should we have an eo_children_iterator_new API and just inherit from
> it ?
> +EAPI Eina_Iterator *
> +evas_object_smart_iterator_new(const Evas_Object *o)
> +{
> +   Eina_Iterator *ret = NULL;
> +   eo_do((Eo *)o, evas_obj_smart_iterator_new(&ret));
> +   return ret;
> +}
> +
> +static void
> +_iterator_new(Eo *o, void *_pd, va_list *list)
> +{
> +   Eina_Iterator **ret = va_arg(*list, Eina_Iterator **);
> +
> +   Evas_Object_Smart_Iterator *it;
> +
> +   const Evas_Object_Smart *priv = _pd;
> +
> +   if (!priv->contained)
> +     {
> +        *ret = NULL;
> +        return ;
> +     }
> +
> +   it = calloc(1, sizeof(Evas_Object_Smart_Iterator));
> +   if (!it)
> +     {
> +        *ret = NULL;
> +        return ;
> +     }
> +
> +   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
> +   it->parent = eo_ref(o);
> +   it->current = priv->contained;
> +
> +   it->iterator.next =
> FUNC_ITERATOR_NEXT(_evas_object_smart_iterator_next);
> +   it->iterator.get_container =
> FUNC_ITERATOR_GET_CONTAINER(_evas_object_smart_iterator_get_container);
> +   it->iterator.free =
> FUNC_ITERATOR_FREE(_evas_object_smart_iterator_free);
> +
> +   *ret = &it->iterator;
> +}
> +
>  EAPI Eina_List *
>  evas_object_smart_members_get(const Evas_Object *eo_obj)
>  {
> @@ -1709,6 +1789,7 @@ _class_constructor(Eo_Class *klass)
>          EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MEMBER_ADD),
> _smart_member_add),
>          EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MEMBER_DEL),
> _smart_member_del),
>          EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MEMBERS_GET),
> _smart_members_get),
> +        EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ITERATOR_NEW),
> _iterator_new),
>
>  
> EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_SET),
> _smart_callbacks_descriptions_set),
>
>  
> EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_GET),
> _smart_callbacks_descriptions_get),
>
>  
> EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_CALLBACK_DESCRIPTION_FIND),
> _smart_callback_description_find),
> @@ -1749,6 +1830,7 @@ static const Eo_Op_Description op_desc[] = {
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_MEMBER_ADD, "Set an Evas
> object as a member of a given smart object."),
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_MEMBER_DEL, "Removes a
> member object from a given smart object."),
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_MEMBERS_GET, "Retrieves the
> list of the member objects of a given Evas smart"),
> +     EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_ITERATOR_NEW, "Retrieves an
> iterator of the member object of a given Evas smart"),
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_SET,
> "Set an smart object instance's smart callbacks descriptions."),
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_CALLBACKS_DESCRIPTIONS_GET,
> "Retrieve an smart object's know smart callback descriptions (both"),
>       EO_OP_DESCRIPTION(EVAS_OBJ_SMART_SUB_ID_CALLBACK_DESCRIPTION_FIND,
> "Find callback description for callback called name."),
>
> --
>
>
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to