* 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.


SVN revision: 53305
This commit is contained in:
Cedric BAIL 2010-10-12 13:26:18 +00:00
parent ed83a01ea0
commit 26ba1c03e3
4 changed files with 68 additions and 3 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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;