From 2ba79e04afe64ca2ee0bfb73a96775c09c619c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Sat, 31 Oct 2009 18:07:08 +0000 Subject: [PATCH] Some more stuff in externals, little api change there, may change some more later. SVN revision: 43379 --- legacy/edje/src/lib/Edje.h | 11 +++++++- legacy/edje/src/lib/edje_calc.c | 15 ++++++++++ legacy/edje/src/lib/edje_external.c | 43 +++++++++++++++++++++++++++-- legacy/edje/src/lib/edje_load.c | 19 +++++++++++-- legacy/edje/src/lib/edje_private.h | 7 +++-- 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index b6f9fc19fd..fe681775f4 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -250,8 +250,13 @@ 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 (*state_set) (void *data, Evas_Object *obj, const void *from_params, const void *to_params, float pos); void (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source); + void *(*params_parse) (void *data, const Eina_List *params); + void (*params_free) (void *params); + + Evas_Object *(*icon_get) (void *data, Evas *e); + const char *(*label_get) (void *data); void *data; }; @@ -400,7 +405,11 @@ extern "C" { /* 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 Eina_Iterator *edje_external_iterator_get(void); EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key); + EAPI Eina_Bool edje_external_param_int_get(const Eina_List *params, const char *key, int *ret); + EAPI Eina_Bool edje_external_param_double_get(const Eina_List *params, const char *key, double *ret); + EAPI Eina_Bool edje_external_param_string_get(const Eina_List *params, const char *key, const char **ret); #ifdef __cplusplus } diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index c4b447f42a..d32e89a37f 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -110,10 +110,15 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl { if (!ep->param2) ep->param2 = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State)); + else if (ep->part->type == EDJE_PART_TYPE_EXTERNAL) + _edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params); + ep->param2->external_params = NULL; } else if (ep->param2) { + if (ep->part->type == EDJE_PART_TYPE_EXTERNAL) + _edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params); eina_mempool_free(_edje_real_part_state_mp, ep->param2); ep->param2 = NULL; } @@ -133,6 +138,13 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl if (ep->param1.description->rel2.id_y >= 0) ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size]; + if (ep->part->type == EDJE_PART_TYPE_EXTERNAL) + { + if (ep->param1.external_params) + _edje_external_parsed_params_free(ep->swallowed_object, ep->param1.external_params); + ep->param1.external_params = _edje_external_params_parse(ep->swallowed_object, ep->param1.description->external_params); + } + if (ep->param2) { ep->param2->description = epd2; @@ -150,6 +162,9 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->rel2.id_x % ed->table_parts_size]; if (ep->param2->description->rel2.id_y >= 0) ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->rel2.id_y % ed->table_parts_size]; + + if (ep->part->type == EDJE_PART_TYPE_EXTERNAL) + ep->param2->external_params = _edje_external_params_parse(ep->swallowed_object, ep->param2->description->external_params); } if (ep->description_pos != 0.0) diff --git a/legacy/edje/src/lib/edje_external.c b/legacy/edje/src/lib/edje_external.c index 04b7c31cc5..1b09fa9163 100644 --- a/legacy/edje/src/lib/edje_external.c +++ b/legacy/edje/src/lib/edje_external.c @@ -24,6 +24,12 @@ edje_external_type_unregister(const char *type_name) return eina_hash_del_by_key(type_registry, type_name); } +EAPI Eina_Iterator * +edje_external_iterator_get(void) +{ + return eina_hash_iterator_tuple_new(type_registry); +} + EAPI Edje_External_Param * edje_external_param_find(const Eina_List *params, const char *key) { @@ -172,6 +178,7 @@ _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Part_Description *chosen_desc) { Edje_External_Type *type; + void *params1, *params2 = NULL; if (!ep->swallowed_object) return; type = evas_object_data_get(ep->swallowed_object, "Edje_External_Type"); @@ -180,8 +187,38 @@ _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (!type->state_set) return; + params1 = ep->param1.external_params ? ep->param1.external_params : ep->param1.description->external_params; + if (ep->param2 && ep->param2->description) + params2 = ep->param2->external_params ? ep->param2->external_params : ep->param2->description->external_params; + type->state_set(type->data, ep->swallowed_object, - ep->param1.description->external_params, - (ep->param2 && ep->param2->description ? ep->param2->description->external_params : NULL), - ep->description_pos); + params1, params2, ep->description_pos); +} + +void * +_edje_external_params_parse(Evas_Object *obj, const Eina_List *params) +{ + Edje_External_Type *type; + + type = evas_object_data_get(obj, "Edje_External_Type"); + if (!type) return NULL; + + if (!type->params_parse) return NULL; + + return type->params_parse(type->data, params); +} + +void +_edje_external_parsed_params_free(Evas_Object *obj, void *params) +{ + Edje_External_Type *type; + + if (!params) return; + + type = evas_object_data_get(obj, "Edje_External_Type"); + if (!type) return; + + if (!type->params_free) return; + + type->params_free(params); } diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 4f0a08b298..64d6013a31 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -600,7 +600,11 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g { 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); + if (child_obj) + { + _edje_real_part_swallow(rp, child_obj); + rp->param1.external_params = _edje_external_params_parse(child_obj, rp->param1.description->external_params); + } } continue; default: @@ -847,8 +851,17 @@ _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 || rp->part->type == EDJE_PART_TYPE_EXTERNAL) - evas_object_del(rp->swallowed_object); + switch (rp->part->type) + { + case EDJE_PART_TYPE_EXTERNAL: + _edje_external_parsed_params_free(rp->swallowed_object, rp->param1.external_params); + if (rp->param2) + _edje_external_parsed_params_free(rp->swallowed_object, rp->param2->external_params); + case EDJE_PART_TYPE_GROUP: + evas_object_del(rp->swallowed_object); + default: + break; + } rp->swallowed_object = NULL; } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 4643300faa..beffd1840a 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -740,8 +740,9 @@ struct _Edje_Real_Part_State int state; // 4 Edje_Calc_Params p; // 96 #endif -}; // 20 -// WITH EDJE_CALC_CACHE 120 + void *external_params; // 4 +}; // 24 +// WITH EDJE_CALC_CACHE 124 struct _Edje_Real_Part_Drag { @@ -1345,5 +1346,7 @@ Evas_Object *_edje_external_type_add(const char *type_name, Evas *evas, Evas_Obj 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); +void *_edje_external_params_parse(Evas_Object *obj, const Eina_List *params); +void _edje_external_parsed_params_free(Evas_Object *obj, void *params); #endif