diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-05-26 14:06:52 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-05-26 19:55:50 +0900 |
commit | 6e487e93b86472b54744f87124c71ef409abb2b7 (patch) | |
tree | b4ebef36671bf87d7bc53f458e511d57ed266bd1 | |
parent | 58d0c89fd9513e61ff2633c8947be326f194ff87 (diff) | |
download | efl-6e487e93b86472b54744f87124c71ef409abb2b7.tar.gz |
Elm Layout: Make box & table part proxies temporary
efl_part returns short lived objects, let's make them
die after each function call.
-rw-r--r-- | src/lib/elementary/efl_ui_layout_internal_box.eo | 1 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_layout_internal_table.eo | 1 | ||||
-rw-r--r-- | src/lib/elementary/elm_layout.c | 28 | ||||
-rw-r--r-- | src/lib/elementary/elm_layout_pack.c | 150 | ||||
-rw-r--r-- | src/lib/elementary/elm_part_helper.h | 17 |
5 files changed, 85 insertions, 112 deletions
diff --git a/src/lib/elementary/efl_ui_layout_internal_box.eo b/src/lib/elementary/efl_ui_layout_internal_box.eo index 015f176790..97fac12d1d 100644 --- a/src/lib/elementary/efl_ui_layout_internal_box.eo +++ b/src/lib/elementary/efl_ui_layout_internal_box.eo @@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Box (Eo.Base, Efl.Pack.Linear) } } implements { - Eo.Base.finalize; Eo.Base.destructor; Efl.Container.content_iterate; Efl.Container.content_count; diff --git a/src/lib/elementary/efl_ui_layout_internal_table.eo b/src/lib/elementary/efl_ui_layout_internal_table.eo index 8a81b19467..c4081c22c0 100644 --- a/src/lib/elementary/efl_ui_layout_internal_table.eo +++ b/src/lib/elementary/efl_ui_layout_internal_table.eo @@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Table (Eo.Base, Efl.Pack.Grid) } } implements { - Eo.Base.finalize; Eo.Base.destructor; Efl.Container.content_iterate; Efl.Container.content_count; diff --git a/src/lib/elementary/elm_layout.c b/src/lib/elementary/elm_layout.c index 660d058f8c..9aab7bc233 100644 --- a/src/lib/elementary/elm_layout.c +++ b/src/lib/elementary/elm_layout.c @@ -1993,45 +1993,24 @@ elm_layout_table_clear(Elm_Layout *obj, const char *part, Eina_Bool clear) /* Efl.Part implementation */ -static EOLIAN void -_elm_layout_internal_part_eo_base_destructor(Eo *obj, Elm_Part_Data *pd) -{ - free(pd->part); - eo_data_xunref(pd->obj, pd->sd, obj); - eo_destructor(eo_super(obj, ELM_LAYOUT_INTERNAL_PART_CLASS)); -} - static EOLIAN Eo_Base * _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd, const char *part) { - Elm_Layout_Sub_Object_Data *sub_d; const Evas_Object *subobj; Elm_Part_Data *pd; - Eina_List *l; Eo *proxy; if (!_elm_layout_part_aliasing_eval(obj, sd, &part, EINA_FALSE)) return NULL; - // Find parts which already have content - if (EINA_LIKELY(!!part)) - { - EINA_LIST_FOREACH(sd->subs, l, sub_d) - { - if ((sub_d->type == TABLE_PACK) || _sub_box_is(sub_d)) - { - if (!strcmp(part, sub_d->part)) - return _elm_layout_pack_proxy_get((Eo *) obj, sub_d->obj, part); - } - } - } - - // Ask edje for existing parts: BOX & TABLE ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL); + + // Ask edje for existing parts subobj = edje_object_part_object_get(wd->resize_obj, part); if (subobj) { + // Support BOX & TABLE proxy = _elm_layout_pack_proxy_get((Eo *) obj, (Eo *) subobj, part); if (proxy) return proxy; } @@ -2050,6 +2029,7 @@ _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd, return proxy; } +ELM_PART_IMPLEMENT_DESTRUCTOR(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_SET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_GET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_UNSET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) diff --git a/src/lib/elementary/elm_layout_pack.c b/src/lib/elementary/elm_layout_pack.c index e8ad6d7c5b..f8f66d2839 100644 --- a/src/lib/elementary/elm_layout_pack.c +++ b/src/lib/elementary/elm_layout_pack.c @@ -10,14 +10,13 @@ #include "elm_priv.h" #include "elm_widget_layout.h" +#include "elm_part_helper.h" #include "efl_ui_layout_internal_box.eo.h" #include "efl_ui_layout_internal_table.eo.h" #include "../evas/canvas/evas_box.eo.h" #include "../evas/canvas/evas_table.eo.h" -#warning TODO: Implement proper lifecycle of proxy objects (single call) - /* layout internals for box & table */ Eina_Bool _elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child); Eina_Bool _elm_layout_box_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child); @@ -31,7 +30,6 @@ Eina_Bool _elm_layout_table_clear(Eo *obj, Elm_Layout_Smart_Data *sd, const c #define BOX_CLASS EFL_UI_LAYOUT_INTERNAL_BOX_CLASS #define TABLE_CLASS EFL_UI_LAYOUT_INTERNAL_TABLE_CLASS -#define DATA_KEY "__elm_layout_internal" typedef struct _Layout_Part_Data Efl_Ui_Layout_Box_Data; typedef struct _Layout_Part_Data Efl_Ui_Layout_Table_Data; @@ -39,10 +37,11 @@ typedef struct _Part_Item_Iterator Part_Item_Iterator; struct _Layout_Part_Data { - Elm_Layout *obj; - Elm_Layout_Smart_Data *sd; + Elm_Layout *obj; // no ref + Elm_Layout_Smart_Data *sd; // data xref Eina_Stringshare *part; Evas_Object *pack; + unsigned char temp; }; struct _Part_Item_Iterator @@ -58,9 +57,6 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part) { Efl_Ui_Layout_Internal_Box *eo; - eo = eo_key_obj_get(pack, DATA_KEY); - if (eo) return eo; - if (eo_isa(pack, EVAS_BOX_CLASS)) eo = eo_add(BOX_CLASS, obj, efl_ui_layout_internal_box_real_part_set(eo_self, obj, pack, part)); @@ -70,31 +66,26 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part) else return NULL; - eo_key_obj_set(pack, DATA_KEY, eo); return eo; } EOLIAN static void -_efl_ui_layout_internal_box_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part) -{ - pd->obj = layout; - pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS); - pd->part = part; - pd->pack = pack; -} - -EOLIAN static Eo_Base * -_efl_ui_layout_internal_box_eo_base_finalize(Eo *obj, Efl_Ui_Layout_Box_Data *pd) +_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd) { - EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL); - return eo_finalize(eo_super(obj, BOX_CLASS)); + ELM_PART_HOOK; + eo_data_xunref(pd->obj, pd->sd, obj); + eina_stringshare_del(pd->part); + eo_destructor(eo_super(obj, BOX_CLASS)); } EOLIAN static void -_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd) +_efl_ui_layout_internal_box_real_part_set(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part) { - eo_key_data_set(pd->pack, DATA_KEY, NULL); - eo_destructor(eo_super(obj, BOX_CLASS)); + pd->obj = layout; + pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj); + eina_stringshare_replace(&pd->part, part); + pd->pack = pack; + pd->temp = 1; } /* this iterator is the same as efl_ui_box */ @@ -153,62 +144,62 @@ _efl_ui_layout_internal_box_efl_container_content_iterate(Eo *obj, Efl_Ui_Layout Eina_Iterator *it; it = evas_object_box_iterator_new(pd->pack); - return _part_item_iterator_create(obj, it, NULL); + ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL)); } EOLIAN static int _efl_ui_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) { - return evas_obj_box_count(pd->pack); + ELM_PART_RETURN_VAL(evas_obj_box_count(pd->pack)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd EINA_UNUSED, Efl_Gfx *content) +_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) { - // alias - return efl_pack_unpack(obj, content); + ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) +_efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) { - return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE); + ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) +_efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) { - return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE); + ELM_PART_RETURN_VAL(_elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) +_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *content) { - return _elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL; + // alias for efl_pack_unpack + return _efl_ui_layout_internal_box_efl_pack_unpack(obj, pd, content); } EOLIAN static Eina_Bool _efl_ui_layout_internal_box_efl_pack_pack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) { - return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj); + ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj)); } EOLIAN static Eina_Bool _efl_ui_layout_internal_box_efl_pack_linear_pack_begin(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) { - return _elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj); + ELM_PART_RETURN_VAL(_elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj)); } EOLIAN static Eina_Bool _efl_ui_layout_internal_box_efl_pack_linear_pack_end(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) { - return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj); + ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj)); } EOLIAN static Eina_Bool _efl_ui_layout_internal_box_efl_pack_linear_pack_before(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, const Efl_Gfx *existing) { - return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing); + ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing)); } EOLIAN static Eina_Bool @@ -218,20 +209,20 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_after(Eo *obj EINA_UNUSED, Efl_ int index; index = efl_pack_index_get(pd->pack, existing); - if (index < 0) return EINA_FALSE; + if (index < 0) ELM_PART_RETURN_VAL(EINA_FALSE); other = efl_pack_content_get(pd->pack, index + 1); if (other) - return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other); + ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other)); - efl_pack_end(obj, subobj); - return EINA_TRUE; + ELM_PART_CALL(efl_pack_end(obj, subobj)); + ELM_PART_RETURN_VAL(EINA_TRUE); } EOLIAN static Eina_Bool _efl_ui_layout_internal_box_efl_pack_linear_pack_at(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, int index) { - return _elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index); + ELM_PART_RETURN_VAL(_elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index)); } EOLIAN static Efl_Gfx * @@ -242,8 +233,8 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_content_get(Eo *obj EINA_UNUSED priv = eo_data_scope_get(pd->pack, EVAS_BOX_CLASS); opt = eina_list_nth(priv->children, index); - if (!opt) return NULL; - return opt->obj; + if (!opt) ELM_PART_RETURN_VAL(NULL); + ELM_PART_RETURN_VAL(opt->obj); } EOLIAN static Efl_Gfx * @@ -252,18 +243,18 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Layou Efl_Gfx *subobj; subobj = efl_pack_content_get(pd->pack, index); - if (!subobj) return NULL; + if (!subobj) ELM_PART_RETURN_VAL(NULL); if (efl_pack_unpack(obj, subobj)) - return subobj; + ELM_PART_RETURN_VAL(subobj); ERR("failed to remove %p from %p (item %d)", subobj, pd->obj, index); - return NULL; + ELM_PART_RETURN_VAL(NULL); } EOLIAN static int _efl_ui_layout_internal_box_efl_pack_linear_pack_index_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, const Efl_Gfx *subobj) { - return efl_pack_index_get(pd->pack, subobj); + ELM_PART_RETURN_VAL(efl_pack_index_get(pd->pack, subobj)); } EOLIAN static Efl_Orient @@ -271,29 +262,27 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_direction_get(Eo *obj EINA_UNUS { ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_ORIENT_NONE); - return efl_pack_direction_get(efl_content_get(efl_part(wd->resize_obj, pd->part))); + ELM_PART_RETURN_VAL(efl_pack_direction_get(efl_part(wd->resize_obj, pd->part))); } + +/* Table proxy implementation */ + EOLIAN static void -_efl_ui_layout_internal_table_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part) +_efl_ui_layout_internal_table_real_part_set(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part) { pd->obj = layout; - pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS); - pd->part = eina_stringshare_add(part); + pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj); + eina_stringshare_replace(&pd->part, part); pd->pack = pack; -} - -EOLIAN static Eo_Base * -_efl_ui_layout_internal_table_eo_base_finalize(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) -{ - EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL); - return eo_finalize(eo_super(obj, TABLE_CLASS)); + pd->temp = 1; } EOLIAN static void -_efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd) +_efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd) { - eo_key_data_set(pd->pack, DATA_KEY, NULL); + ELM_PART_HOOK; + eo_data_xunref(pd->obj, pd->sd, obj); eina_stringshare_del(pd->part); eo_destructor(eo_super(obj, TABLE_CLASS)); } @@ -305,50 +294,51 @@ _efl_ui_layout_internal_table_efl_container_content_iterate(Eo *obj, Efl_Ui_Layo it = evas_object_table_iterator_new(pd->pack); - return _part_item_iterator_create(obj, it, NULL); + ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL)); } EOLIAN static int _efl_ui_layout_internal_table_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) { - return evas_obj_table_count(pd->pack); + ELM_PART_RETURN_VAL(evas_obj_table_count(pd->pack)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd EINA_UNUSED, Efl_Gfx *content) +_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) { - return efl_pack_unpack(obj, content); + ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) +_efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) { - return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE); + ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE)); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) +_efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj) { - return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE); + if (!subobj) ELM_PART_RETURN_VAL(EINA_FALSE); + ELM_PART_RETURN_VAL(_elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj); } EOLIAN static Eina_Bool -_efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj) +_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *content) { - if (!subobj) return EINA_FALSE; - return _elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj; + // alias for efl_pack_unpack + return _efl_ui_layout_internal_table_efl_pack_unpack(obj, pd, content); } EOLIAN static Eina_Bool _efl_ui_layout_internal_table_efl_pack_grid_pack_grid(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj, int col, int row, int colspan, int rowspan) { - return _elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan); + ELM_PART_RETURN_VAL(_elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan)); } EOLIAN static Efl_Gfx * _efl_ui_layout_internal_table_efl_pack_grid_grid_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, int col, int row) { - return evas_object_table_child_get(pd->pack, col, row); + ELM_PART_RETURN_VAL(evas_object_table_child_get(pd->pack, col, row)); } EOLIAN static Eina_Iterator * @@ -376,7 +366,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_contents_get(Eo *obj EINA_UNUSE } } - return _part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l); + ELM_PART_RETURN_VAL(_part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l)); } EOLIAN static Eina_Bool @@ -391,7 +381,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_position_get(Eo *obj EINA_UNUSE if (colspan) *colspan = cs; if (rowspan) *rowspan = rs; - return ret; + ELM_PART_RETURN_VAL(ret); } EOLIAN static void @@ -405,7 +395,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_columns_get(Eo *obj EINA_UNUSED { int cols, rows; evas_object_table_col_row_size_get(pd->pack, &cols, &rows); - return cols; + ELM_PART_RETURN_VAL(cols); } EOLIAN static int @@ -413,7 +403,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_rows_get(Eo *obj EINA_UNUSED, E { int cols, rows; evas_object_table_col_row_size_get(pd->pack, &cols, &rows); - return rows; + ELM_PART_RETURN_VAL(rows); } #include "efl_ui_layout_internal_box.eo.c" diff --git a/src/lib/elementary/elm_part_helper.h b/src/lib/elementary/elm_part_helper.h index d1593d9a7e..f180acd4c5 100644 --- a/src/lib/elementary/elm_part_helper.h +++ b/src/lib/elementary/elm_part_helper.h @@ -3,10 +3,13 @@ #include "elm_layout_internal_part.eo.h" +//#define ELM_PART_HOOK do { ERR("%p:%s [%d]", pd->obj, pd->part, (int) pd->temp); } while(0) +#define ELM_PART_HOOK + #define ELM_PART_REF(obj, pd) do { if (!(pd->temp++)) eo_ref(obj); } while(0) #define ELM_PART_UNREF(obj, pd) do { if (pd->temp) { if (!(--pd->temp)) eo_unref(obj); } } while(0) -#define ELM_PART_RETURN_VAL(a) do { typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0) -#define ELM_PART_RETURN_VOID do { ELM_PART_UNREF(obj, pd); return; } while(0) +#define ELM_PART_RETURN_VAL(a) do { ELM_PART_HOOK; typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0) +#define ELM_PART_RETURN_VOID do { ELM_PART_HOOK; ELM_PART_UNREF(obj, pd); return; } while(0) #define ELM_PART_CALL(a) ({ ELM_PART_REF(obj, pd); a; }) typedef struct _Elm_Part_Data Elm_Part_Data; @@ -21,17 +24,19 @@ struct _Elm_Part_Data // Note: this generic implementation can be improved to support part object // caching or something... -// Main part proxy implementation -#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \ -\ +#define ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \ static EOLIAN void \ _ ## type ## _internal_part_eo_base_destructor(Eo *obj, partdata *pd) \ { \ + ELM_PART_HOOK; \ free(pd->part); \ eo_data_xunref(pd->obj, pd->sd, obj); \ eo_destructor(eo_super(obj, TYPE ## _INTERNAL_PART_CLASS)); \ } \ -\ + +// Main part proxy implementation +#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \ +ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \ static EOLIAN Eo_Base * \ _ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \ { \ |