summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorsachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>2009-10-26 21:33:56 +0000
committersachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>2009-10-26 21:33:56 +0000
commit1e22ab8aa7929fc86086b6a33c2ab74499e1182a (patch)
tree7ec3ad116ba7fd0ff3793bfe90272f432cc84983 /src/lib
parentf49a92df1183c1a76e267841f62dd375f57d03fd (diff)
downloadedje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.tar.gz
edje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.tar.bz2
edje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.zip
External objects support by Brian 'rephorm' Mattern
Since we are on a freeze, the patch goes on updated to current svn, but without changing its API. After the freeze some things will be added, and some will change :) git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@43302 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Edje.h39
-rw-r--r--src/lib/Makefile.am3
-rw-r--r--src/lib/edje_calc.c4
-rw-r--r--src/lib/edje_data.c12
-rw-r--r--src/lib/edje_load.c12
-rw-r--r--src/lib/edje_main.c3
-rw-r--r--src/lib/edje_private.h8
-rw-r--r--src/lib/edje_program.c26
8 files changed, 95 insertions, 12 deletions
diff --git a/src/lib/Edje.h b/src/lib/Edje.h
index 7eb0bf2..b6f9fc1 100644
--- a/src/lib/Edje.h
+++ b/src/lib/Edje.h
@@ -90,7 +90,8 @@ typedef enum _Edje_Part_Type
EDJE_PART_TYPE_GROUP = 7,
EDJE_PART_TYPE_BOX = 8,
EDJE_PART_TYPE_TABLE = 9,
- EDJE_PART_TYPE_LAST = 10
+ EDJE_PART_TYPE_EXTERNAL = 10,
+ EDJE_PART_TYPE_LAST = 11
} Edje_Part_Type;
typedef enum _Edje_Text_Effect
@@ -226,6 +227,37 @@ enum
EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9
};
+enum _Edje_External_Param_Type
+{
+ EDJE_EXTERNAL_PARAM_TYPE_INT,
+ EDJE_EXTERNAL_PARAM_TYPE_DOUBLE,
+ EDJE_EXTERNAL_PARAM_TYPE_STRING,
+ EDJE_EXTERNAL_PARAM_TYPE_MAX
+};
+typedef enum _Edje_External_Param_Type Edje_External_Param_Type;
+
+struct _Edje_External_Param
+{
+ const char *name;
+ Edje_External_Param_Type type;
+ // XXX these could be in a union, but eet doesn't support them (or does it?)
+ int i;
+ double d;
+ const char *s;
+};
+typedef struct _Edje_External_Param Edje_External_Param;
+
+struct _Edje_External_Type
+{
+ Evas_Object *(*add) (void *data, Evas *evas, Evas_Object *parent, const Eina_List *params);
+ void (*state_set) (void *data, Evas_Object *obj, const Eina_List *from_params, const Eina_List *to_params, float pos);
+ void (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source);
+
+ void *data;
+};
+typedef struct _Edje_External_Type Edje_External_Type;
+
+
typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source);
typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part);
typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg);
@@ -365,6 +397,11 @@ extern "C" {
EAPI void edje_message_signal_process (void);
+ /* edje_external.c */
+ EAPI Eina_Bool edje_external_type_register(const char *type_name, Edje_External_Type *type_info);
+ EAPI Eina_Bool edje_external_type_unregister(const char *type_name);
+ EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 6a4c7d5..62a5bd7 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -42,7 +42,8 @@ edje_textblock_styles.c \
edje_edit.c \
edje_script_only.c \
edje_lua_script_only.c \
-edje_entry.c
+edje_entry.c \
+edje_external.c
libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ -lm
libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index 2d2cc86..c4b447f 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -1874,6 +1874,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
/* move and resize are needed for all previous object => no break here. */
case EDJE_PART_TYPE_SWALLOW:
case EDJE_PART_TYPE_GROUP:
+ case EDJE_PART_TYPE_EXTERNAL:
/* visibility and color have no meaning on SWALLOW and GROUP part. */
evas_object_move(ep->object, ed->x + pf->x, ed->y + pf->y);
evas_object_resize(ep->object, pf->w, pf->h);
@@ -1903,6 +1904,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
case EDJE_PART_TYPE_TABLE:
_edje_table_recalc_apply(ed, ep, pf, chosen_desc);
break;
+ case EDJE_PART_TYPE_EXTERNAL:
+ _edje_external_recalc_apply(ed, ep, pf, chosen_desc);
+ break;
case EDJE_PART_TYPE_RECTANGLE:
case EDJE_PART_TYPE_SWALLOW:
case EDJE_PART_TYPE_GROUP:
diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c
index c913d60..c33c0b4 100644
--- a/src/lib/edje_data.c
+++ b/src/lib/edje_data.c
@@ -26,6 +26,7 @@ EAPI Eet_Data_Descriptor *_edje_edd_edje_part_collection = NULL;
EAPI Eet_Data_Descriptor *_edje_edd_edje_part = NULL;
EAPI Eet_Data_Descriptor *_edje_edd_edje_part_description = NULL;
EAPI Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL;
+EAPI Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL;
#define FREED(eed) \
if (eed) \
@@ -59,6 +60,7 @@ _edje_edd_shutdown(void)
FREED(_edje_edd_edje_part);
FREED(_edje_edd_edje_part_description);
FREED(_edje_edd_edje_part_image_id);
+ FREED(_edje_edd_edje_external_param);
}
void
@@ -213,6 +215,15 @@ _edje_edd_init(void)
eet_data_descriptor_file_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_image_id, Edje_Part_Image_Id, "id", id, EET_T_INT);
+ EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Param);
+ _edje_edd_edje_external_param =
+ eet_data_descriptor_file_new(&eddc);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "name", name, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "type", type, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "i", i, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "d", d, EET_T_DOUBLE);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "s", s, EET_T_STRING);
+
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description);
_edje_edd_edje_part_description =
eet_data_descriptor_file_new(&eddc);
@@ -318,6 +329,7 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.y", table.align.y, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Edje_Part_Description, "external_params", external_params, _edje_edd_edje_external_param);
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Pack_Element);
_edje_edd_edje_pack_element =
diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index 53e7a23..4f0a08b 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -399,6 +399,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
break;
case EDJE_PART_TYPE_SWALLOW:
case EDJE_PART_TYPE_GROUP:
+ case EDJE_PART_TYPE_EXTERNAL:
rp->object = evas_object_rectangle_add(ed->evas);
evas_object_color_set(rp->object, 0, 0, 0, 0);
evas_object_pass_events_set(rp->object, 1);
@@ -595,6 +596,13 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
source = pack_it->source;
}
break;
+ case EDJE_PART_TYPE_EXTERNAL:
+ {
+ Evas_Object *child_obj;
+ child_obj = _edje_external_type_add(rp->part->source, evas_object_evas_get(ed->obj), ed->obj, rp->part->default_desc->external_params);
+ if (child_obj) _edje_real_part_swallow(rp, child_obj);
+ }
+ continue;
default:
continue;
}
@@ -839,7 +847,7 @@ _edje_file_del(Edje *ed)
/* Objects swallowed by the app do not get deleted,
but those internally swallowed (GROUP type) do. */
- if (rp->part->type == EDJE_PART_TYPE_GROUP)
+ if (rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL)
evas_object_del(rp->swallowed_object);
rp->swallowed_object = NULL;
@@ -1138,6 +1146,8 @@ _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigne
EINA_LIST_FREE(desc->image.tween_list, pi)
free(pi);
+ if (desc->external_params)
+ _edje_external_params_free(desc->external_params, free_strings);
if (free_strings)
{
if (desc->color_class) eina_stringshare_del(desc->color_class);
diff --git a/src/lib/edje_main.c b/src/lib/edje_main.c
index aeeffef..33faf50 100644
--- a/src/lib/edje_main.c
+++ b/src/lib/edje_main.c
@@ -96,6 +96,7 @@ edje_init(void)
_edje_edd_init();
_edje_text_init();
_edje_box_init();
+ _edje_external_init();
_edje_lua_init();
_edje_message_init();
@@ -126,6 +127,7 @@ edje_init(void)
_edje_real_part_mp = NULL;
_edje_message_shutdown();
_edje_lua_shutdown();
+ _edje_external_shutdown();
_edje_box_shutdown();
_edje_text_class_members_free();
_edje_text_class_hash_free();
@@ -183,6 +185,7 @@ edje_shutdown(void)
_edje_message_shutdown();
_edje_lua_shutdown();
+ _edje_external_shutdown();
_edje_box_shutdown();
_edje_text_class_members_free();
_edje_text_class_hash_free();
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 9892068..4643300 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -567,6 +567,7 @@ struct _Edje_Part_Description
} table;
Edje_Color color, color2, color3; /* color for rect or text, shadow etc. */
+ Eina_List *external_params; /* parameters for external objects */
unsigned char visible; /* is it shown */
};
@@ -1338,4 +1339,11 @@ void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Co
void _edje_entry_select_allow_set(Edje_Real_Part *rp, Eina_Bool allow);
void _edje_entry_select_abort(Edje_Real_Part *rp);
+void _edje_external_init();
+void _edje_external_shutdown();
+Evas_Object *_edje_external_type_add(const char *type_name, Evas *evas, Evas_Object *parent, const Eina_List *params);
+void _edje_external_signal_emit(Evas_Object *obj, const char *emission, const char *source);
+void _edje_external_params_free(Eina_List *params, unsigned int free_strings);
+void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
+
#endif
diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c
index b804992..066603e 100644
--- a/src/lib/edje_program.c
+++ b/src/lib/edje_program.c
@@ -944,8 +944,8 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
{
size_t length;
char *part;
- /* the signal contains a colon, split the signal into "group:signal",
- * and deliver it to "group"
+ /* the signal contains a colon, split the signal into "part:signal",
+ * and deliver it to "part" (if there is a GROUP or EXTERNAL part named "part")
*/
length = strlen(sig) + 1;
part = alloca(length);
@@ -962,17 +962,25 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *rp = ed->table_parts[i];
- if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
+ if ((rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL) &&
(rp->swallowed_object) &&
(rp->part) && (rp->part->name) &&
(strcmp(rp->part->name, part) == 0))
{
- Edje *ed2 = _edje_fetch(rp->swallowed_object);
- if (ed2) _edje_emit(ed2, newsig, src);
- return; /* stop processing.
- * XXX maybe let signal be processed anyway?
- * XXX in this case, just comment this line
- */
+ if (rp->part->type == EDJE_PART_TYPE_GROUP)
+ {
+ Edje *ed2 = _edje_fetch(rp->swallowed_object);
+ if (ed2) _edje_emit(ed2, newsig, src);
+ return; /* stop processing.
+ * XXX maybe let signal be processed anyway?
+ * XXX in this case, just comment this line
+ */
+ }
+ else if (rp->part->type == EDJE_PART_TYPE_EXTERNAL)
+ {
+ _edje_external_signal_emit(rp->swallowed_object, newsig, src);
+ return;
+ }
}
}
}