efl: merge list->iterator creation function into evas_main.c and reuse

this deduplicates a large amount of code
This commit is contained in:
Mike Blumenkrantz 2018-02-14 21:14:52 -05:00
parent 0a9bb2543f
commit 3789e3e1dc
5 changed files with 65 additions and 161 deletions

View File

@ -8,8 +8,6 @@
PROXY_IMPLEMENTATION(box, MY_CLASS, EINA_FALSE)
#undef PROXY_IMPLEMENTATION
typedef struct _Part_Item_Iterator Part_Item_Iterator;
/* Legacy features */
EOLIAN static Eina_Bool
@ -127,53 +125,6 @@ _efl_canvas_layout_part_box_efl_pack_linear_pack_index_get(Eo *obj, void *_pd EI
return -1;
}
/* this iterator is the same as efl_ui_box */
static Eina_Bool
_part_item_iterator_next(Part_Item_Iterator *it, void **data)
{
Efl_Gfx *sub;
if (!it->object) return EINA_FALSE;
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
return EINA_FALSE;
if (data) *data = sub;
return EINA_TRUE;
}
static Eo *
_part_item_iterator_get_container(Part_Item_Iterator *it)
{
return it->object;
}
static void
_part_item_iterator_free(Part_Item_Iterator *it)
{
eina_iterator_free(it->real_iterator);
efl_wref_del(it->object, &it->object);
free(it);
}
static Eina_Iterator *
_part_item_iterator_create(Eo *obj, Eina_Iterator *real_iterator)
{
Part_Item_Iterator *it;
it = calloc(1, sizeof(*it));
if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->real_iterator = real_iterator;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_part_item_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_part_item_iterator_get_container);
it->iterator.free = FUNC_ITERATOR_FREE(_part_item_iterator_free);
efl_wref_add(obj, &it->object);
return &it->iterator;
}
EOLIAN static Eina_Iterator *
_efl_canvas_layout_part_box_efl_container_content_iterate(Eo *obj, void *_pd EINA_UNUSED)
@ -184,7 +135,7 @@ _efl_canvas_layout_part_box_efl_container_content_iterate(Eo *obj, void *_pd EIN
if (!pd->rp->typedata.container) return NULL;
it = evas_object_box_iterator_new(pd->rp->object);
return _part_item_iterator_create(pd->rp->object, it);
return efl_canvas_iterator_create(pd->rp->object, it, NULL);
}
EOLIAN static int

View File

@ -10,54 +10,6 @@ PROXY_IMPLEMENTATION(table, MY_CLASS, EINA_FALSE)
typedef struct _Part_Item_Iterator Part_Item_Iterator;
/* this iterator is the same as efl_ui_box */
static Eina_Bool
_part_item_iterator_next(Part_Item_Iterator *it, void **data)
{
Efl_Gfx *sub;
if (!it->object) return EINA_FALSE;
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
return EINA_FALSE;
if (data) *data = sub;
return EINA_TRUE;
}
static Eo *
_part_item_iterator_get_container(Part_Item_Iterator *it)
{
return it->object;
}
static void
_part_item_iterator_free(Part_Item_Iterator *it)
{
eina_iterator_free(it->real_iterator);
efl_wref_del(it->object, &it->object);
free(it);
}
static Eina_Iterator *
_part_item_iterator_create(Eo *obj, Eina_Iterator *real_iterator)
{
Part_Item_Iterator *it;
it = calloc(1, sizeof(*it));
if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->real_iterator = real_iterator;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_part_item_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_part_item_iterator_get_container);
it->iterator.free = FUNC_ITERATOR_FREE(_part_item_iterator_free);
efl_wref_add(obj, &it->object);
return &it->iterator;
}
EOLIAN static Eina_Iterator *
_efl_canvas_layout_part_table_efl_container_content_iterate(Eo *obj, void *_pd EINA_UNUSED)
{
@ -67,7 +19,7 @@ _efl_canvas_layout_part_table_efl_container_content_iterate(Eo *obj, void *_pd E
if (!pd->rp->typedata.container) return NULL;
it = evas_object_table_iterator_new(pd->rp->object);
return _part_item_iterator_create(pd->rp->object, it);
return efl_canvas_iterator_create(pd->rp->object, it, NULL);
}
EOLIAN static int

View File

@ -31,7 +31,6 @@ Eina_Bool _efl_ui_layout_table_clear(Eo *obj, Efl_Ui_Layout_Data *sd, const c
typedef struct _Layout_Part_Data Efl_Ui_Layout_Box_Data;
typedef struct _Layout_Part_Data Efl_Ui_Layout_Table_Data;
typedef struct _Part_Item_Iterator Part_Item_Iterator;
struct _Layout_Part_Data
{
@ -41,14 +40,6 @@ struct _Layout_Part_Data
unsigned char temp;
};
struct _Part_Item_Iterator
{
Eina_Iterator iterator;
Eina_List *list;
Eina_Iterator *real_iterator;
Eo *object;
};
Eo *
_efl_ui_layout_pack_proxy_get(Efl_Ui_Layout *obj, Edje_Part_Type type, const char *part)
{
@ -80,63 +71,13 @@ _efl_ui_layout_part_box_real_part_set(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Eo *l
pd->temp = 1;
}
/* this iterator is the same as efl_ui_box */
static Eina_Bool
_part_item_iterator_next(Part_Item_Iterator *it, void **data)
{
Efl_Gfx *sub;
if (!it->object) return EINA_FALSE;
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
return EINA_FALSE;
if (data) *data = sub;
return EINA_TRUE;
}
static Eo *
_part_item_iterator_get_container(Part_Item_Iterator *it)
{
return it->object;
}
static void
_part_item_iterator_free(Part_Item_Iterator *it)
{
eina_iterator_free(it->real_iterator);
efl_wref_del(it->object, &it->object);
eina_list_free(it->list);
free(it);
}
static Eina_Iterator *
_part_item_iterator_create(Eo *obj, Eina_Iterator *real_iterator, Eina_List *list)
{
Part_Item_Iterator *it;
it = calloc(1, sizeof(*it));
if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->list = list;
it->real_iterator = real_iterator;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_part_item_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_part_item_iterator_get_container);
it->iterator.free = FUNC_ITERATOR_FREE(_part_item_iterator_free);
efl_wref_add(obj, &it->object);
return &it->iterator;
}
EOLIAN static Eina_Iterator *
_efl_ui_layout_part_box_efl_container_content_iterate(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
{
Eina_Iterator *it;
Eo *pack = (Eo *) edje_object_part_object_get(pd->obj, pd->part);
it = evas_object_box_iterator_new(pack);
return _part_item_iterator_create(obj, it, NULL);
return efl_canvas_iterator_create(obj, it, NULL);
}
EOLIAN static int
@ -289,7 +230,7 @@ _efl_ui_layout_part_table_efl_container_content_iterate(Eo *obj, Efl_Ui_Layout_T
it = evas_object_table_iterator_new(pack);
return _part_item_iterator_create(obj, it, NULL);
return efl_canvas_iterator_create(obj, it, NULL);
}
EOLIAN static int
@ -364,7 +305,7 @@ _efl_ui_layout_part_table_efl_pack_table_table_contents_get(Eo *obj EINA_UNUSED,
}
}
return _part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l);
return efl_canvas_iterator_create(pd->obj, eina_list_iterator_new(l), l);
}
EOLIAN static Eina_Bool

View File

@ -50,6 +50,8 @@ EAPI void evas_render_pending_objects_flush(Evas *eo_evas);
EAPI void efl_input_pointer_finalize(Efl_Input_Pointer *obj);
EAPI Eina_Iterator *efl_canvas_iterator_create(Eo *obj, Eina_Iterator *real_iterator, Eina_List *list);
static inline void
evas_object_size_hint_combined_min_get(const Eo *obj, int *w, int *h)
{

View File

@ -1387,6 +1387,64 @@ get_layer_objects(Evas_Layer *l)
return (EINA_INLIST_GET(l->objects));
}
typedef struct _Efl_Canvas_Iterator
{
Eina_Iterator iterator;
Eina_List *list;
Eina_Iterator *real_iterator;
Eo *object;
} Efl_Canvas_Iterator;
/* this iterator is the same as efl_ui_box */
static Eina_Bool
_efl_canvas_iterator_next(Efl_Canvas_Iterator *it, void **data)
{
Efl_Gfx *sub;
if (!it->object) return EINA_FALSE;
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
return EINA_FALSE;
if (data) *data = sub;
return EINA_TRUE;
}
static Eo *
_efl_canvas_iterator_get_container(Efl_Canvas_Iterator *it)
{
return it->object;
}
static void
_efl_canvas_iterator_free(Efl_Canvas_Iterator *it)
{
eina_iterator_free(it->real_iterator);
efl_wref_del(it->object, &it->object);
eina_list_free(it->list);
free(it);
}
EAPI Eina_Iterator *
efl_canvas_iterator_create(Eo *obj, Eina_Iterator *real_iterator, Eina_List *list)
{
Efl_Canvas_Iterator *it;
it = calloc(1, sizeof(*it));
if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->list = list;
it->real_iterator = real_iterator;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_efl_canvas_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_efl_canvas_iterator_get_container);
it->iterator.free = FUNC_ITERATOR_FREE(_efl_canvas_iterator_free);
efl_wref_add(obj, &it->object);
return &it->iterator;
}
EOLIAN Evas_Object*
_evas_canvas_object_top_at_xy_get(const Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
{