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
