forked from enlightenment/efl
Bug fix - about type change in group inherit.
Lately, raster removed the code about the prohibition of type-change in group inherit. But about the "part" of different type, the data structure of the their "description" is different. So if the type is changed, it have to be reallocated. Current, it is not. At first, we have to remove the lookups. If we don't, when lookup module executes, the memory may be broken. So I removed all lookups for reallocated description before it is reallocated. And I changed all description of the "part" is reallocated when the type is changed. The attribute of the "part" is remained. Just it reallocated the part of **_Spec_**. SVN revision: 66242
This commit is contained in:
parent
376d82d0c5
commit
052a06726f
|
@ -831,7 +831,7 @@ _edje_part_description_fill(Edje_Part_Description_Spec_Fill *fill)
|
|||
}
|
||||
|
||||
static Edje_Part_Description_Common *
|
||||
_edje_part_description_alloc(unsigned char type, const char *collection, const char *part)
|
||||
_edje_part_description_alloc(Edje_Part_Description_Common *ced, unsigned char type, const char *collection, const char *part)
|
||||
{
|
||||
Edje_Part_Description_Common *result = NULL;
|
||||
|
||||
|
@ -840,14 +840,15 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
case EDJE_PART_TYPE_RECTANGLE:
|
||||
case EDJE_PART_TYPE_SWALLOW:
|
||||
case EDJE_PART_TYPE_GROUP:
|
||||
result = mem_alloc(SZ(Edje_Part_Description_Common));
|
||||
result = mem_realloc(ced, SZ(Edje_Part_Description_Common));
|
||||
break;
|
||||
case EDJE_PART_TYPE_TEXT:
|
||||
case EDJE_PART_TYPE_TEXTBLOCK:
|
||||
{
|
||||
Edje_Part_Description_Text *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_Text));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_Text));
|
||||
memset(&(ed->text), 0, SZ(Edje_Part_Description_Spec_Text));
|
||||
|
||||
ed->text.color3.r = 0;
|
||||
ed->text.color3.g = 0;
|
||||
|
@ -865,7 +866,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
{
|
||||
Edje_Part_Description_Image *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_Image));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_Image));
|
||||
memset(&(ed->image), 0, SZ(Edje_Part_Description_Spec_Image));
|
||||
|
||||
ed->image.id = -1;
|
||||
|
||||
|
@ -878,7 +880,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
{
|
||||
Edje_Part_Description_Proxy *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_Proxy));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_Proxy));
|
||||
memset(&(ed->proxy), 0, SZ(Edje_Part_Description_Spec_Proxy));
|
||||
|
||||
ed->proxy.id = -1;
|
||||
|
||||
|
@ -891,7 +894,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
{
|
||||
Edje_Part_Description_Box *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_Box));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_Box));
|
||||
memset(&(ed->box), 0, SZ(Edje_Part_Description_Spec_Box));
|
||||
|
||||
ed->box.layout = NULL;
|
||||
ed->box.alt_layout = NULL;
|
||||
|
@ -907,7 +911,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
{
|
||||
Edje_Part_Description_Table *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_Table));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_Table));
|
||||
memset(&(ed->table), 0, SZ(Edje_Part_Description_Spec_Table));
|
||||
|
||||
ed->table.homogeneous = EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE;
|
||||
ed->table.align.x = FROM_DOUBLE(0.5);
|
||||
|
@ -922,7 +927,8 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
{
|
||||
Edje_Part_Description_External *ed;
|
||||
|
||||
ed = mem_alloc(SZ(Edje_Part_Description_External));
|
||||
ed = mem_realloc(ced, SZ(Edje_Part_Description_External));
|
||||
ed->external_params = NULL;
|
||||
|
||||
ed->external_params = NULL;
|
||||
|
||||
|
@ -940,6 +946,53 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
|
|||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_part_description_lookup_del(Edje_Part_Collection *pc, Edje_Part_Description_Common *ced, unsigned char type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case EDJE_PART_TYPE_RECTANGLE:
|
||||
case EDJE_PART_TYPE_SWALLOW:
|
||||
case EDJE_PART_TYPE_GROUP:
|
||||
break;
|
||||
case EDJE_PART_TYPE_TEXT:
|
||||
case EDJE_PART_TYPE_TEXTBLOCK:
|
||||
{
|
||||
Edje_Part_Description_Text *ed = (Edje_Part_Description_Text*)ced;
|
||||
|
||||
data_queue_part_lookup(pc, NULL, &(ed->text.id_source));
|
||||
data_queue_part_lookup(pc, NULL, &(ed->text.id_text_source));
|
||||
break;
|
||||
}
|
||||
case EDJE_PART_TYPE_IMAGE:
|
||||
{
|
||||
int i;
|
||||
Edje_Part_Description_Image *ed = (Edje_Part_Description_Image*)ced;
|
||||
Edje_Part_Image_Id *iid;
|
||||
|
||||
data_queue_image_lookup(NULL, &(ed->image.id), NULL);
|
||||
|
||||
for (i = 0; i < ed->image.tweens_count; i++)
|
||||
{
|
||||
iid = ed->image.tweens[i];
|
||||
data_queue_image_lookup(NULL, &(iid->id), NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EDJE_PART_TYPE_PROXY:
|
||||
{
|
||||
Edje_Part_Description_Proxy *ed = (Edje_Part_Description_Proxy*)ced;
|
||||
|
||||
data_queue_part_lookup(pc, NULL, &(ed->proxy.id));
|
||||
break;
|
||||
}
|
||||
case EDJE_PART_TYPE_BOX:
|
||||
case EDJE_PART_TYPE_TABLE:
|
||||
case EDJE_PART_TYPE_EXTERNAL:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_program_check(const char *name, Edje_Program *me, Edje_Program **pgrms, unsigned int count)
|
||||
{
|
||||
|
@ -2944,9 +2997,22 @@ st_collections_group_parts_part_name(void)
|
|||
static void
|
||||
st_collections_group_parts_part_type(void)
|
||||
{
|
||||
Edje_Part_Collection *pc;
|
||||
Edje_Part *ep;
|
||||
int i;
|
||||
|
||||
check_arg_count(1);
|
||||
|
||||
current_part->type = parse_enum(0,
|
||||
pc = eina_list_data_get(eina_list_last(edje_collections));
|
||||
ep = current_part;
|
||||
|
||||
if (ep->default_desc)
|
||||
_edje_part_description_lookup_del(pc, ep->default_desc, ep->type);
|
||||
|
||||
for (i = 0; i < ep->other.desc_count; i++)
|
||||
_edje_part_description_lookup_del(pc, ep->other.desc[i], ep->type);
|
||||
|
||||
ep->type = parse_enum(0,
|
||||
"NONE", EDJE_PART_TYPE_NONE,
|
||||
"RECT", EDJE_PART_TYPE_RECTANGLE,
|
||||
"TEXT", EDJE_PART_TYPE_TEXT,
|
||||
|
@ -2959,6 +3025,11 @@ st_collections_group_parts_part_type(void)
|
|||
"EXTERNAL", EDJE_PART_TYPE_EXTERNAL,
|
||||
"PROXY", EDJE_PART_TYPE_PROXY,
|
||||
NULL);
|
||||
if (ep->default_desc)
|
||||
ep->default_desc = _edje_part_description_alloc(ep->default_desc, ep->type, pc->part, ep->name);
|
||||
|
||||
for (i = 0; i < ep->other.desc_count; i++)
|
||||
ep->other.desc[i] = _edje_part_description_alloc(ep->other.desc[i], ep->type, pc->part, ep->name);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -4070,7 +4141,7 @@ ob_collections_group_parts_part_description(void)
|
|||
pc = eina_list_data_get(eina_list_last(edje_collections));
|
||||
ep = current_part;
|
||||
|
||||
ed = _edje_part_description_alloc(ep->type, pc->part, ep->name);
|
||||
ed = _edje_part_description_alloc(ed, ep->type, pc->part, ep->name);
|
||||
|
||||
if (!ep->default_desc)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,22 @@ mem_alloc(size_t size)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void *
|
||||
mem_realloc(void *p, size_t size)
|
||||
{
|
||||
void *mem;
|
||||
|
||||
if (!p)
|
||||
mem = calloc(1, size);
|
||||
else
|
||||
mem = realloc(p, size);
|
||||
if (mem) return mem;
|
||||
ERR("%s: Error. %s:%i memory allocation of " FMT_SIZE_T " bytes failed. %s",
|
||||
progname, file_in, line, size, strerror(errno));
|
||||
exit(-1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
mem_strdup(const char *s)
|
||||
{
|
||||
|
|
|
@ -1391,7 +1391,7 @@ data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
|
|||
if ((pl->pc == pc) && (pl->dest == dest))
|
||||
{
|
||||
free(pl->name);
|
||||
if (name[0])
|
||||
if (name && name[0])
|
||||
pl->name = mem_strdup(name);
|
||||
else
|
||||
{
|
||||
|
@ -1401,7 +1401,7 @@ data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
|
|||
return;
|
||||
}
|
||||
}
|
||||
if (!name[0]) return;
|
||||
if (!name || !name[0]) return;
|
||||
|
||||
pl = mem_alloc(SZ(Part_Lookup));
|
||||
part_lookups = eina_list_append(part_lookups, pl);
|
||||
|
@ -1536,8 +1536,25 @@ data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest)
|
|||
void
|
||||
data_queue_image_lookup(char *name, int *dest, Eina_Bool *set)
|
||||
{
|
||||
Eina_List *l;
|
||||
Image_Lookup *il;
|
||||
|
||||
EINA_LIST_FOREACH(image_lookups, l, il)
|
||||
{
|
||||
if (il->dest == dest)
|
||||
{
|
||||
free(il->name);
|
||||
if (name && name[0])
|
||||
il->name = mem_strdup(name);
|
||||
else
|
||||
{
|
||||
image_lookups = eina_list_remove(image_lookups, il);
|
||||
free(il);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!name || !name[0]) return;
|
||||
|
||||
il = mem_alloc(SZ(Image_Lookup));
|
||||
image_lookups = eina_list_append(image_lookups, il);
|
||||
il->name = mem_strdup(name);
|
||||
|
|
Loading…
Reference in New Issue