summaryrefslogtreecommitdiff
path: root/src/lib/edje
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/edje')
-rw-r--r--src/lib/edje/edje_containers.c272
-rw-r--r--src/lib/edje/edje_object.eo3
-rw-r--r--src/lib/edje/edje_private.h5
-rw-r--r--src/lib/edje/edje_util.c30
-rw-r--r--src/lib/edje/efl_canvas_layout_internal.eo15
-rw-r--r--src/lib/edje/efl_canvas_layout_internal_box.eo17
-rw-r--r--src/lib/edje/efl_canvas_layout_internal_swallow.eo16
-rw-r--r--src/lib/edje/efl_canvas_layout_internal_table.eo13
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;