From: cedric Date: Tue, 12 Oct 2010 13:26:18 +0000 (+0000) Subject: * edje: fix signal comming from aliased part. X-Git-Tag: submit/trunk/20120815.180907~840 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8114e4013ef111f26ddd75a9cebb992c14235eda;p=profile%2Fivi%2Fedje.git * edje: fix signal comming from aliased part. I needed to bump minor file format version, but it will only change behaviour for people using alias for part and they couldn't use the signal emitted by them. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@53305 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/bin/edje_cc_handlers.c b/src/bin/edje_cc_handlers.c index fcf3113..558b3a7 100644 --- a/src/bin/edje_cc_handlers.c +++ b/src/bin/edje_cc_handlers.c @@ -2015,13 +2015,21 @@ static void st_collections_group_parts_alias(void) { Edje_Part_Collection *pc; + const char *alias; + const char *aliased; check_arg_count(2); pc = eina_list_data_get(eina_list_last(edje_collections)); + alias = parse_str(0); + aliased = parse_str(1); + if (!pc->alias) pc->alias = eina_hash_string_small_new(NULL); - eina_hash_add(pc->alias, parse_str(0), parse_str(1)); + eina_hash_add(pc->alias, alias, aliased); + + if (!pc->aliased) pc->aliased = eina_hash_string_small_new(NULL); + eina_hash_add(pc->aliased, aliased, alias); } diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c index d4ca34e..ac9a5a0 100644 --- a/src/lib/edje_data.c +++ b/src/lib/edje_data.c @@ -777,6 +777,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_HASH(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_string); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_collection, Edje_Part_Collection, "alias", alias); + EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_collection, Edje_Part_Collection, "aliased", aliased); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.w", prop.min.w, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.h", prop.min.h, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.max.w", prop.max.w, EET_T_INT); diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c index 52a72f6..c51220c 100644 --- a/src/lib/edje_load.c +++ b/src/lib/edje_load.c @@ -1346,14 +1346,38 @@ _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it) evas_object_resize(obj, w, h); } +static const char * +_edje_find_alias(Eina_Hash *aliased, char *src, int *length) +{ + const char *alias; + char *search; + + *length = strlen(src); + if (*length == 0) return NULL; + + alias = eina_hash_find(aliased, src); + if (alias) return alias; + + search = strrchr(src, EDJE_PART_PATH_SEPARATOR); + if (search == NULL) return NULL; + + *search = '\0'; + alias = _edje_find_alias(aliased, src, length); + *search = EDJE_PART_PATH_SEPARATOR; + + return alias; +} + static void _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *source) { Evas_Object *parent; Edje *ed; + Edje *ed_parent; char new_src[4096]; /* XXX is this max reasonable? */ size_t length_parent = 0; size_t length_source; + const char *alias = NULL; parent = data; ed = _edje_fetch(obj); @@ -1370,5 +1394,36 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char * new_src[length_parent] = EDJE_PART_PATH_SEPARATOR; memcpy(new_src + length_parent + 1, source, length_source + 1); - edje_object_signal_emit(parent, signal, new_src); + /* Handle alias renaming */ + ed_parent = _edje_fetch(parent); + if (ed_parent && ed_parent->collection && ed_parent->collection->aliased) + { + int length; + + alias = _edje_find_alias(ed_parent->collection->aliased, new_src, &length); + + if (alias) + { + int origin; + + /* Add back the end of the source */ + origin = strlen(new_src); + length ++; /* Remove the trailing ':' from the count */ + if (origin > length) + { + char *tmp; + int alias_length; + + alias_length = strlen(alias); + tmp = alloca(alias_length + origin - length + 2); + memcpy(tmp, alias, alias_length); + tmp[alias_length] = EDJE_PART_PATH_SEPARATOR; + memcpy(tmp + alias_length + 1, new_src + length, origin - length + 1); + + alias = tmp; + } + } + } + + edje_object_signal_emit(parent, signal, alias ? alias : new_src); } diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h index a6c1dd8..7dee495 100644 --- a/src/lib/edje_private.h +++ b/src/lib/edje_private.h @@ -172,7 +172,7 @@ struct _Edje_Smart_Api /* increment this when you add new feature to edje file format without * breaking backward compatibility. */ -#define EDJE_FILE_MINOR 0 +#define EDJE_FILE_MINOR 1 /* FIXME: * @@ -628,6 +628,7 @@ struct _Edje_Part_Collection int id; /* the collection id */ Eina_Hash *alias; /* aliasing part */ + Eina_Hash *aliased; /* invert match of alias */ struct { Edje_Size min, max;