forked from enlightenment/efl
* edje: fix case with recursive alias.
With that patch Enki should be working well and all application using alias for part in edje should be fine too. SVN revision: 56899
This commit is contained in:
parent
b4f5d791a5
commit
546dba4856
|
@ -16,3 +16,7 @@
|
||||||
2011-02-08 Cedric BAIL
|
2011-02-08 Cedric BAIL
|
||||||
|
|
||||||
* Fix invalid memory access by edje alias code.
|
* Fix invalid memory access by edje alias code.
|
||||||
|
|
||||||
|
2011-02-10 Cedric BAIL
|
||||||
|
|
||||||
|
* Fix use of recursive alias.
|
||||||
|
|
|
@ -4433,7 +4433,6 @@ _edje_real_part_recursive_get(const Edje *ed, const char *part)
|
||||||
path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
|
path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
|
||||||
if (!path) return NULL;
|
if (!path) return NULL;
|
||||||
|
|
||||||
//printf("recursive get: %s\n", part);
|
|
||||||
rp = _edje_real_part_recursive_get_helper(ed, path);
|
rp = _edje_real_part_recursive_get_helper(ed, path);
|
||||||
|
|
||||||
free(*path);
|
free(*path);
|
||||||
|
@ -4450,7 +4449,6 @@ _edje_recursive_get(Edje *ed, const char *part, Edje_Real_Part **orp)
|
||||||
path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
|
path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
|
||||||
if (!path) return NULL;
|
if (!path) return NULL;
|
||||||
|
|
||||||
//printf("recursive get: %s\n", part);
|
|
||||||
oed = _edje_recursive_get_helper(ed, path, orp);
|
oed = _edje_recursive_get_helper(ed, path, orp);
|
||||||
|
|
||||||
free(*path);
|
free(*path);
|
||||||
|
@ -4506,12 +4504,41 @@ _edje_children_get(Edje_Real_Part *rp, const char *partid)
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* rebuild alternative path */
|
||||||
|
char *
|
||||||
|
_edje_merge_path(const char *alias, char * const *path)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
unsigned int length = 1;
|
||||||
|
unsigned int alias_length;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (!alias) return NULL;
|
||||||
|
|
||||||
|
alias_length = strlen(alias);
|
||||||
|
|
||||||
|
for (i = 0; path[i]; i++)
|
||||||
|
length += strlen(path[i]) + 1;
|
||||||
|
|
||||||
|
tmp = malloc(sizeof (char) * (length + alias_length + 2));
|
||||||
|
memcpy(tmp, alias, alias_length);
|
||||||
|
tmp[alias_length] = '\0';
|
||||||
|
|
||||||
|
for (i = 0; path[i]; i++)
|
||||||
|
{
|
||||||
|
strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
|
||||||
|
strcat(tmp, path[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Edje_Real_Part *
|
Edje_Real_Part *
|
||||||
_edje_real_part_recursive_get_helper(const Edje *ed, char **path)
|
_edje_real_part_recursive_get_helper(const Edje *ed, char **path)
|
||||||
{
|
{
|
||||||
Edje_Real_Part *rp;
|
Edje_Real_Part *rp;
|
||||||
Evas_Object *child;
|
Evas_Object *child;
|
||||||
const char *alias = NULL;
|
|
||||||
char *idx = NULL;
|
char *idx = NULL;
|
||||||
|
|
||||||
if (!path[0])
|
if (!path[0])
|
||||||
|
@ -4519,16 +4546,18 @@ _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
|
||||||
|
|
||||||
if (ed->collection && ed->collection->alias)
|
if (ed->collection && ed->collection->alias)
|
||||||
{
|
{
|
||||||
alias = eina_hash_find(ed->collection->alias, path[0]);
|
char *alias;
|
||||||
if (alias) alias = strdupa(alias);
|
|
||||||
|
alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
|
||||||
|
if (alias) {
|
||||||
|
rp = _edje_real_part_recursive_get(ed, alias);
|
||||||
|
free(alias);
|
||||||
|
return rp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!alias)
|
|
||||||
alias = path[0];
|
|
||||||
|
|
||||||
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
|
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
|
||||||
if (alias)
|
idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
|
||||||
idx = strchr(alias, EDJE_PART_PATH_SEPARATOR_INDEXL);
|
|
||||||
if (idx)
|
if (idx)
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
|
@ -4542,18 +4571,9 @@ _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alias != path[0])
|
rp = _edje_real_part_get(ed, path[0]);
|
||||||
{
|
if (!path[1] && !idx) return rp;
|
||||||
rp = _edje_real_part_recursive_get(ed, alias);
|
if (!rp) return NULL;
|
||||||
if (!path[1] && !idx) return rp;
|
|
||||||
if (!rp) return NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rp = _edje_real_part_get(ed, path[0]);
|
|
||||||
if (!path[1] && !idx) return rp;
|
|
||||||
if (!rp) return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (rp->part->type)
|
switch (rp->part->type)
|
||||||
{
|
{
|
||||||
|
@ -4571,7 +4591,8 @@ _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
|
||||||
|
|
||||||
child = _edje_children_get(rp, idx);
|
child = _edje_children_get(rp, idx);
|
||||||
|
|
||||||
ed = _edje_fetch(child);
|
ed = _edje_fetch(child);
|
||||||
|
|
||||||
if (!ed) return NULL;
|
if (!ed) return NULL;
|
||||||
return _edje_real_part_recursive_get_helper(ed, path);
|
return _edje_real_part_recursive_get_helper(ed, path);
|
||||||
default:
|
default:
|
||||||
|
@ -4585,18 +4606,27 @@ _edje_recursive_get_helper(Edje *ed, char **path, Edje_Real_Part **orp)
|
||||||
{
|
{
|
||||||
Evas_Object *child;
|
Evas_Object *child;
|
||||||
Edje_Real_Part *rp;
|
Edje_Real_Part *rp;
|
||||||
const char *alias = NULL;
|
|
||||||
char *idx = NULL;
|
char *idx = NULL;
|
||||||
|
|
||||||
if (ed->collection && ed->collection->alias)
|
if (!path[0])
|
||||||
alias = eina_hash_find(ed->collection->alias, path[0]);
|
return NULL;
|
||||||
|
|
||||||
if (!alias)
|
if (ed->collection && ed->collection->alias)
|
||||||
alias = path[0];
|
{
|
||||||
|
char *alias;
|
||||||
|
|
||||||
|
alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
|
||||||
|
if (alias) {
|
||||||
|
Edje *tmp;
|
||||||
|
|
||||||
|
tmp = _edje_recursive_get(ed, alias, orp);
|
||||||
|
free(alias);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
|
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
|
||||||
if (alias)
|
idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
|
||||||
idx = strchr(alias, EDJE_PART_PATH_SEPARATOR_INDEXL);
|
|
||||||
if (idx)
|
if (idx)
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
|
@ -4610,12 +4640,9 @@ _edje_recursive_get_helper(Edje *ed, char **path, Edje_Real_Part **orp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alias != path[0])
|
rp = _edje_real_part_get(ed, path[0]);
|
||||||
rp = _edje_real_part_recursive_get(ed, alias);
|
|
||||||
else
|
|
||||||
rp = _edje_real_part_get(ed, path[0]);
|
|
||||||
|
|
||||||
if (!rp) return NULL;
|
if (!rp) return NULL;
|
||||||
|
|
||||||
if (!path[1] && !idx)
|
if (!path[1] && !idx)
|
||||||
{
|
{
|
||||||
*orp = rp;
|
*orp = rp;
|
||||||
|
|
Loading…
Reference in New Issue