diff options
Diffstat (limited to 'src/lib/edje')
-rw-r--r-- | src/lib/edje/edje_containers.c | 272 | ||||
-rw-r--r-- | src/lib/edje/edje_object.eo | 3 | ||||
-rw-r--r-- | src/lib/edje/edje_private.h | 5 | ||||
-rw-r--r-- | src/lib/edje/edje_util.c | 30 | ||||
-rw-r--r-- | src/lib/edje/efl_canvas_layout_internal.eo | 15 | ||||
-rw-r--r-- | src/lib/edje/efl_canvas_layout_internal_box.eo | 17 | ||||
-rw-r--r-- | src/lib/edje/efl_canvas_layout_internal_swallow.eo | 16 | ||||
-rw-r--r-- | src/lib/edje/efl_canvas_layout_internal_table.eo | 13 |
8 files changed, 175 insertions, 196 deletions
diff --git a/src/lib/edje/edje_containers.c b/src/lib/edje/edje_containers.c index 037af612b2..d0f4f0a6cf 100644 --- a/src/lib/edje/edje_containers.c +++ b/src/lib/edje/edje_containers.c @@ -1,19 +1,25 @@ #include "edje_private.h" +#define EFL_CANVAS_LAYOUT_INTERNAL_PROTECTED #define EFL_CANVAS_LAYOUT_INTERNAL_BOX_PROTECTED #define EFL_CANVAS_LAYOUT_INTERNAL_TABLE_PROTECTED +#define EFL_CANVAS_LAYOUT_INTERNAL_SWALLOW_PROTECTED +#include "efl_canvas_layout_internal.eo.h" #include "efl_canvas_layout_internal_box.eo.h" #include "efl_canvas_layout_internal_table.eo.h" +#include "efl_canvas_layout_internal_swallow.eo.h" #include "../evas/canvas/evas_box.eo.h" #include "../evas/canvas/evas_table.eo.h" -#define BOX_CLASS EFL_CANVAS_LAYOUT_INTERNAL_BOX_CLASS -#define TABLE_CLASS EFL_CANVAS_LAYOUT_INTERNAL_TABLE_CLASS +#define BOX_CLASS EFL_CANVAS_LAYOUT_INTERNAL_BOX_CLASS +#define TABLE_CLASS EFL_CANVAS_LAYOUT_INTERNAL_TABLE_CLASS +#define SWALLOW_CLASS EFL_CANVAS_LAYOUT_INTERNAL_SWALLOW_CLASS typedef struct _Edje_Part_Data Edje_Box_Data; typedef struct _Edje_Part_Data Edje_Table_Data; +typedef struct _Edje_Part_Data Edje_Swallow_Data; typedef struct _Part_Item_Iterator Part_Item_Iterator; struct _Edje_Part_Data @@ -38,92 +44,109 @@ struct _Part_Item_Iterator #define RETURN_VOID do { PROXY_UNREF(obj, pd); return; } while(0) #define PROXY_CALL(a) ({ PROXY_REF(obj, pd); a; }) +/* ugly macros to avoid code duplication */ + +#define PROXY_RESET(type) \ + do { if (_ ## type ## _proxy) \ + { \ + eo_del_intercept_set(_ ## type ## _proxy, NULL); \ + eo_unref(_ ## type ## _proxy); \ + _ ## type ## _proxy = NULL; \ + } } while (0) + +#define PROXY_DEL_CB(type) \ +static void \ +type ## _del_cb(Eo *proxy) \ +{ \ + if (_ ## type ## _proxy) \ + { \ + eo_del_intercept_set(proxy, NULL); \ + eo_unref(proxy); \ + return; \ + } \ + if (eo_parent_get(proxy)) \ + { \ + eo_ref(proxy); \ + eo_parent_set(proxy, NULL); \ + } \ + _ ## type ## _proxy = proxy; \ +} + +#define PROXY_IMPLEMENTATION(type, TYPE, datatype) \ +Eo * \ +_edje_ ## type ## _internal_proxy_get(Edje_Object *obj EINA_UNUSED, Edje *ed, Edje_Real_Part *rp) \ +{ \ + Edje_Box_Data *pd; \ + Eo *proxy; \ + \ + pd = eo_data_scope_get(_ ## type ## _proxy, TYPE ## _CLASS); \ + if (!pd) \ + { \ + if (_ ## type ## _proxy) \ + { \ + ERR("Found invalid handle for efl_part. Reset."); \ + _ ## type ## _proxy = NULL; \ + } \ + return eo_add(TYPE ## _CLASS, ed->obj, \ + _edje_real_part_set(eo_self, ed, rp, rp->part->name)); \ + } \ + \ + if (EINA_UNLIKELY(pd->temp)) \ + { \ + /* warn about misuse, since non-implemented functions may trigger this \ + * misuse by accident. */ \ + ERR("Misuse of efl_part detected. Handles returned by efl_part() are " \ + "valid for a single function call! Did you call a non implemented " \ + "function?"); \ + } \ + proxy = _ ## type ## _proxy; \ + _ ## type ## _proxy = NULL; \ + _edje_real_part_set(proxy, ed, rp, rp->part->name); \ + return proxy; \ +} \ +\ +EOLIAN static void \ +_efl_canvas_layout_internal_ ## type ## _efl_canvas_layout_internal_real_part_set(Eo *obj, datatype *pd, void *ed, void *rp, const char *part) \ +{ \ + pd->ed = ed; \ + pd->rp = rp; \ + pd->part = part; \ + pd->temp = 1; \ + eo_del_intercept_set(obj, type ## _del_cb); \ + eo_parent_set(obj, pd->ed->obj); \ +} \ +\ +EOLIAN static Eo_Base * \ +_efl_canvas_layout_internal_ ## type ## _eo_base_finalize(Eo *obj, datatype *pd) \ +{ \ + EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->rp && pd->ed && pd->part, NULL); \ + return eo_finalize(eo_super(obj, TYPE ## _CLASS)); \ +} + static Eo *_box_proxy = NULL; static Eo *_table_proxy = NULL; +static Eo *_swallow_proxy = NULL; void _edje_internal_proxy_shutdown(void) { - if (_box_proxy) - { - eo_del_intercept_set(_box_proxy, NULL); - eo_unref(_box_proxy); - _box_proxy = NULL; - } - if (_table_proxy) - { - eo_del_intercept_set(_table_proxy, NULL); - eo_unref(_table_proxy); - _table_proxy = NULL; - } + PROXY_RESET(box); + PROXY_RESET(table); + PROXY_RESET(swallow); } -static void -_box_del_cb(Eo *proxy) -{ - if (_box_proxy) - { - eo_del_intercept_set(proxy, NULL); - eo_unref(proxy); - return; - } - if (eo_parent_get(proxy)) - { - eo_ref(proxy); - eo_parent_set(proxy, NULL); - } - _box_proxy = proxy; -} +PROXY_DEL_CB(box) +PROXY_DEL_CB(table) +PROXY_DEL_CB(swallow) -Eo * -_edje_box_internal_proxy_get(Edje_Object *obj EINA_UNUSED, Edje *ed, Edje_Real_Part *rp) -{ - Edje_Box_Data *pd; - Eo *proxy; +PROXY_IMPLEMENTATION(box, BOX, Edje_Box_Data) +PROXY_IMPLEMENTATION(table, TABLE, Edje_Table_Data) +PROXY_IMPLEMENTATION(swallow, SWALLOW, Edje_Swallow_Data) - pd = eo_data_scope_get(_box_proxy, BOX_CLASS); - if (!pd) - { - if (_box_proxy) - { - ERR("Found invalid handle for efl_part. Reset."); - _box_proxy = NULL; - } - return eo_add - (BOX_CLASS, ed->obj, - efl_canvas_layout_internal_box_real_part_set(eo_self, ed, rp, rp->part->name)); - } - if (EINA_UNLIKELY(pd->temp)) - { - /* warn about misuse, since non-implemented functions may trigger this - * misuse by accident. */ - ERR("Misuse of efl_part detected. Handles returned by efl_part() are " - "valid for a single function call! Did you call a non implemented " - "function?"); - } - proxy = _box_proxy; - _box_proxy = NULL; - efl_canvas_layout_internal_box_real_part_set(proxy, ed, rp, rp->part->name); - return proxy; -} +#undef PROXY_RESET +#undef PROXY_DEL_CB +#undef PROXY_IMPLEMENTATION -EOLIAN static void -_efl_canvas_layout_internal_box_real_part_set(Eo *obj, Edje_Box_Data *pd, void *ed, void *rp, const char *part) -{ - pd->ed = ed; - pd->rp = rp; - pd->part = part; - pd->temp = 1; - eo_del_intercept_set(obj, _box_del_cb); - eo_parent_set(obj, pd->ed->obj); -} - -EOLIAN static Eo_Base * -_efl_canvas_layout_internal_box_eo_base_finalize(Eo *obj, Edje_Box_Data *pd) -{ - EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->rp && pd->ed && pd->part, NULL); - return eo_finalize(eo_super(obj, BOX_CLASS)); -} /* Legacy features */ @@ -313,76 +336,6 @@ _efl_canvas_layout_internal_box_efl_pack_linear_pack_direction_get(Eo *obj, Edje RETURN_VAL(EFL_ORIENT_NONE); } -/* Table */ - -static void -_table_del_cb(Eo *proxy) -{ - if (_table_proxy) - { - eo_del_intercept_set(proxy, NULL); - eo_unref(proxy); - return; - } - if (eo_parent_get(proxy)) - { - eo_ref(proxy); - eo_parent_set(proxy, NULL); - } - _table_proxy = proxy; -} - -Eo * -_edje_table_internal_proxy_get(Edje_Object *obj EINA_UNUSED, Edje *ed, Edje_Real_Part *rp) -{ - Edje_Box_Data *pd; - Eo *proxy; - - pd = eo_data_scope_get(_table_proxy, TABLE_CLASS); - if (!pd) - { - if (_table_proxy) - { - ERR("Found invalid handle for efl_part. Reset."); - _table_proxy = NULL; - } - return eo_add - (TABLE_CLASS, ed->obj, - efl_canvas_layout_internal_table_real_part_set(eo_self, ed, rp, rp->part->name)); - } - - if (EINA_UNLIKELY(pd->temp)) - { - /* warn about misuse, since non-implemented functions may trigger this - * misuse by accident. */ - ERR("Misuse of efl_part detected. Handles returned by efl_part() are " - "valid for a single function call! Did you call a non implemented " - "function?"); - } - proxy = _table_proxy; - _table_proxy = NULL; - efl_canvas_layout_internal_table_real_part_set(proxy, ed, rp, rp->part->name); - return proxy; -} - -EOLIAN static void -_efl_canvas_layout_internal_table_real_part_set(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, void *ed, void *rp, const char *part) -{ - pd->ed = ed; - pd->rp = rp; - pd->part = part; - pd->temp = 1; - eo_del_intercept_set(obj, _table_del_cb); - eo_parent_set(obj, pd->ed->obj); -} - -EOLIAN static Eo_Base * -_efl_canvas_layout_internal_table_eo_base_finalize(Eo *obj, Edje_Table_Data *pd) -{ - EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->rp && pd->ed && pd->part, NULL); - return eo_finalize(eo_super(obj, TABLE_CLASS)); -} - EOLIAN static Eina_Iterator * _efl_canvas_layout_internal_table_efl_container_content_iterate(Eo *obj, Edje_Table_Data *pd) { @@ -546,6 +499,29 @@ _efl_canvas_layout_internal_table_efl_pack_grid_grid_position_get(Eo *obj, Edje_ RETURN_VAL(ret); } +/* Swallow parts */ +EOLIAN static Efl_Gfx * +_efl_canvas_layout_internal_swallow_efl_container_content_get(Eo *obj, Edje_Swallow_Data *pd) +{ + RETURN_VAL(_edje_efl_container_content_get(pd->ed, pd->part)); +} + +EOLIAN static Eina_Bool +_efl_canvas_layout_internal_swallow_efl_container_content_set(Eo *obj, Edje_Swallow_Data *pd, Efl_Gfx *content) +{ + RETURN_VAL(_edje_efl_container_content_set(pd->ed, pd->part, content)); +} + +EOLIAN static Efl_Gfx * +_efl_canvas_layout_internal_swallow_efl_container_content_unset(Eo *obj, Edje_Swallow_Data *pd) +{ + Efl_Gfx *content = _edje_efl_container_content_get(pd->ed, pd->part); + if (!content) RETURN_VAL(NULL); + PROXY_CALL(efl_content_remove(obj, content)); + RETURN_VAL(content); +} + + /* Legacy API implementation */ #ifdef DEGUG @@ -681,5 +657,7 @@ edje_object_part_table_clear(Edje_Object *obj, const char *part, Eina_Bool clear return efl_pack_unpack_all(table); } +#include "efl_canvas_layout_internal.eo.c" #include "efl_canvas_layout_internal_box.eo.c" #include "efl_canvas_layout_internal_table.eo.c" +#include "efl_canvas_layout_internal_swallow.eo.c" diff --git a/src/lib/edje/edje_object.eo b/src/lib/edje/edje_object.eo index d79cd9338a..dedd11f64d 100644 --- a/src/lib/edje/edje_object.eo +++ b/src/lib/edje/edje_object.eo @@ -2000,9 +2000,6 @@ class Edje.Object (Evas.Smart.Clipped, Efl.File, Efl.Container, Efl.Part) Efl.File.file.get; Efl.File.mmap.set; Efl.File.mmap.get; - Efl.Container.content.set; - Efl.Container.content.get; - Efl.Container.content_unset; Efl.Container.content_remove; Efl.Container.content_part_name.get; Efl.Part.part; diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index d307ea6974..05b0b6480d 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -2959,6 +2959,11 @@ Eina_Bool _edje_part_table_unpack(Edje *ed, const char *part, Evas_Object *child Eina_Bool _edje_part_table_col_row_size_get(Edje *ed, const char *part, int *cols, int *rows); Eina_Bool _edje_part_table_clear(Edje *ed, const char *part, Eina_Bool clear); +/* part containers: swallow */ +Eo *_edje_swallow_internal_proxy_get(Edje_Object *obj, Edje *ed, Edje_Real_Part *rp); +Efl_Gfx *_edje_efl_container_content_get(Edje *ed, const char *part); +Eina_Bool _edje_efl_container_content_set(Edje *ed, const char *part, Efl_Gfx *obj_swallow); + void _edje_internal_proxy_shutdown(void); #ifdef HAVE_LIBREMIX diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index a01eda4112..ad87ef7da4 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -3511,9 +3511,8 @@ _edje_object_text_markup_filter_callback_del_full(Eo *obj EINA_UNUSED, Edje *ed, return NULL; } -EOLIAN Eina_Bool -_edje_object_efl_container_content_set(Eo *obj EINA_UNUSED, Edje *ed, - const char *part, Efl_Gfx *obj_swallow) +Eina_Bool +_edje_efl_container_content_set(Edje *ed, const char *part, Efl_Gfx *obj_swallow) { Edje_Real_Part *rp, *rpcur; Edje_User_Defined *eud = NULL; @@ -3872,8 +3871,8 @@ _edje_object_efl_container_content_remove(Eo *obj EINA_UNUSED, Edje *ed, Evas_Ob return EINA_TRUE; } -EOLIAN Efl_Gfx * -_edje_object_efl_container_content_get(Eo *obj EINA_UNUSED, Edje *ed, const char *part) +Efl_Gfx * +_edje_efl_container_content_get(Edje *ed, const char *part) { Edje_Real_Part *rp; @@ -3897,21 +3896,6 @@ _edje_object_efl_container_content_get(Eo *obj EINA_UNUSED, Edje *ed, const char } /* new in eo */ -EOLIAN Efl_Gfx * -_edje_object_efl_container_content_unset(Eo *obj, Edje *ed EINA_UNUSED, const char *part) -{ - Efl_Gfx *content; - - content = efl_content_get(obj, part); - if (!content) return NULL; - - if (efl_content_remove(obj, content)) - return content; - - return NULL; -} - -/* new in eo */ EOLIAN const char * _edje_object_efl_container_content_part_name_get(Eo *obj EINA_UNUSED, Edje *ed EINA_UNUSED, Efl_Gfx *content) { @@ -3940,6 +3924,8 @@ _edje_object_efl_part_part(Eo *obj, Edje *ed, const char *part) return _edje_box_internal_proxy_get(obj, ed, rp); else if (rp->part->type == EDJE_PART_TYPE_TABLE) return _edje_table_internal_proxy_get(obj, ed, rp); + else if (rp->part->type == EDJE_PART_TYPE_SWALLOW) + return _edje_swallow_internal_proxy_get(obj, ed, rp); else return NULL; /* FIXME/TODO: text & others (color, ...) */ } @@ -6822,7 +6808,7 @@ _edje_part_mask_flags_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Evas_Event_F EAPI Eina_Bool edje_object_part_swallow(Edje_Object *obj, const char *part, Evas_Object *obj_swallow) { - return efl_content_set(obj, part, obj_swallow); + return efl_content_set(efl_part(obj, part), obj_swallow); } EAPI void @@ -6834,7 +6820,7 @@ edje_object_part_unswallow(Edje_Object *obj, Evas_Object *obj_swallow) EAPI Evas_Object * edje_object_part_swallow_get(const Edje_Object *obj, const char *part) { - return efl_content_get(obj, part); + return efl_content_get(efl_part(obj, part)); } /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ diff --git a/src/lib/edje/efl_canvas_layout_internal.eo b/src/lib/edje/efl_canvas_layout_internal.eo new file mode 100644 index 0000000000..38ff692a95 --- /dev/null +++ b/src/lib/edje/efl_canvas_layout_internal.eo @@ -0,0 +1,15 @@ +interface Efl.Canvas.Layout_Internal () +{ + [[Internal APIs used by Edje part objects.]] + eo_prefix: _edje; + methods { + @property real_part @protected { + set {} + values { + ed: void*; + rp: void*; + part: const(char)*; + } + } + } +} diff --git a/src/lib/edje/efl_canvas_layout_internal_box.eo b/src/lib/edje/efl_canvas_layout_internal_box.eo index 48284b901a..a84499d26a 100644 --- a/src/lib/edje/efl_canvas_layout_internal_box.eo +++ b/src/lib/edje/efl_canvas_layout_internal_box.eo @@ -1,23 +1,14 @@ -class Efl.Canvas.Layout_Internal.Box (Eo.Base, Efl.Pack.Linear) +class Efl.Canvas.Layout_Internal.Box (Eo.Base, Efl.Canvas.Layout_Internal, Efl.Pack.Linear) { [[Represents a Box created as part of a layout. - Can not be deleted, this is only a representation of an internal object - of an EFL layout. + Its lifetime is limited to one function call only, unless an extra + reference is explicitely held. ]] data: Edje_Box_Data; - methods { - @property real_part @protected { - set {} - values { - ed: void*; - rp: void*; - part: const(char)*; - } - } - } implements { Eo.Base.finalize; + Efl.Canvas.Layout_Internal.real_part.set; Efl.Container.content_iterate; Efl.Container.content_count; Efl.Container.content_remove; diff --git a/src/lib/edje/efl_canvas_layout_internal_swallow.eo b/src/lib/edje/efl_canvas_layout_internal_swallow.eo new file mode 100644 index 0000000000..dbfc694c6a --- /dev/null +++ b/src/lib/edje/efl_canvas_layout_internal_swallow.eo @@ -0,0 +1,16 @@ +class Efl.Canvas.Layout_Internal.Swallow (Eo.Base, Efl.Canvas.Layout_Internal, Efl.Container) +{ + [[Represents a SWALLOW part of an Edje object. + + Its lifetime is limited to one function call only, unless an extra + reference is explicitely held. + ]] + data: Edje_Swallow_Data; + implements { + Eo.Base.finalize; + Efl.Canvas.Layout_Internal.real_part.set; + Efl.Container.content.get; + Efl.Container.content.set; + Efl.Container.content_unset; + } +} diff --git a/src/lib/edje/efl_canvas_layout_internal_table.eo b/src/lib/edje/efl_canvas_layout_internal_table.eo index ddebbc9ce6..b52a244c42 100644 --- a/src/lib/edje/efl_canvas_layout_internal_table.eo +++ b/src/lib/edje/efl_canvas_layout_internal_table.eo @@ -1,4 +1,4 @@ -class Efl.Canvas.Layout_Internal.Table (Eo.Base, Efl.Pack.Grid) +class Efl.Canvas.Layout_Internal.Table (Eo.Base, Efl.Canvas.Layout_Internal, Efl.Pack.Grid) { [[Represents a Table created as part of a layout. @@ -6,18 +6,9 @@ class Efl.Canvas.Layout_Internal.Table (Eo.Base, Efl.Pack.Grid) of an EFL layout. ]] data: Edje_Table_Data; - methods { - @property real_part @protected { - set {} - values { - ed: void*; - rp: void*; - part: const(char)*; - } - } - } implements { Eo.Base.finalize; + Efl.Canvas.Layout_Internal.real_part.set; Efl.Container.content_iterate; Efl.Container.content_count; Efl.Container.content_remove; |