{
void *element; /* A pointer to the element. */
Ecore_Desktop_Tree_Element_Type type; /* The type of the element. */
+ unsigned char free : 1;
};
typedef struct _Ecore_Desktop_Tree_Element Ecore_Desktop_Tree_Element;
Ecore_Desktop_Tree *
element);
Ecore_Desktop_Tree *ecore_desktop_tree_add_hash(Ecore_Desktop_Tree * tree,
- Ecore_Hash * element);
+ Ecore_Hash * element,
+ int free);
void ecore_desktop_tree_remove(Ecore_Desktop_Tree * tree,
int element);
int ecore_desktop_tree_exist(Ecore_Desktop_Tree * tree,
ecore_desktop_tree_foreach(menus, 0, _ecore_desktop_menu_make_apps,
func);
// FIXME: Can't free this just yet, causes major memory corruption.
-// ecore_desktop_tree_del(menus);
+ ecore_desktop_tree_del(menus);
}
free(menu_file);
}
tree->elements[element].type =
ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL;
tree->elements[element].element = NULL;
+ tree->elements[element].free = 0;
}
else if (strcmp((char *)tree->elements[element].element, "<Menu") == 0)
{
tree->elements[element].element = menu;
tree->elements[element].type =
ECORE_DESKTOP_TREE_ELEMENT_TYPE_TREE;
+ tree->elements[element].free = 1;
for (i = element + 1; i < tree->size; i++)
{
int result = 0;
tree->elements[i].type =
ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL;
tree->elements[i].element = NULL;
+ tree->elements[i].free = 0;
}
else
if (strcmp
ecore_hash_set_free_value(apps, free);
ecore_desktop_tree_extend(menu, "<MENU < > <> <>");
ecore_desktop_tree_extend(menu, "<MENU_PATH ");
- ecore_desktop_tree_add_hash(menu, pool);
+ ecore_desktop_tree_add_hash(menu, pool, 1);
ecore_desktop_tree_add_child(menu, rules);
- ecore_desktop_tree_add_hash(menu, apps);
+ ecore_desktop_tree_add_hash(menu, apps, 1);
}
else
{
{
while (unxml_data->stack->size < level)
ecore_desktop_tree_add_hash(unxml_data->stack,
- generate_data.pool);
+ generate_data.pool, 0);
ecore_desktop_tree_add_hash(unxml_data->stack,
- generate_data.pool);
+ generate_data.pool, 0);
}
else
{
desktop->allocated = TRUE;
if (generate_data->include)
{
- ecore_hash_set(generate_data->apps, key, strdup(app));
+ ecore_hash_set(generate_data->apps, strdup(key), strdup(app));
#ifdef DEBUG
printf("INCLUDING %s%s - %s\n",
((generate_data->unallocated) ? "UNALLOCATED " : ""),
1) *
sizeof
(Ecore_Desktop_Tree_Element));
- tree->elements[tree->size].element = element;
+ tree->elements[tree->size].element = strdup(element);
+ tree->elements[tree->size].free = 0;
tree->elements[tree->size++].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_STRING;
return tree;
}
{
tree->elements[i].element = tree->elements[i - 1].element;
tree->elements[i].type = tree->elements[i - 1].type;
+ tree->elements[i].free = tree->elements[i - 1].free;
}
tree->elements[before].element = element;
tree->elements[before].type = type;
+ tree->elements[before].free = free;
return tree;
}
{
tree->elements[i].element = tree->elements[i - size].element;
tree->elements[i].type = tree->elements[i - size].type;
+ tree->elements[i].free = tree->elements[i - size].free;
}
for (i = 0; i < size; i++)
{
tree->elements[before + i].element = element->elements[i].element;
tree->elements[before + i].type = element->elements[i].type;
+ tree->elements[before + i].free = element->elements[i].free;
}
}
sizeof
(Ecore_Desktop_Tree_Element));
tree->elements[tree->size].element = element;
+ tree->elements[tree->size].free = 1;
tree->elements[tree->size++].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_TREE;
element->parent = tree;
return tree;
}
Ecore_Desktop_Tree *
-ecore_desktop_tree_add_hash(Ecore_Desktop_Tree * tree, Ecore_Hash * element)
+ecore_desktop_tree_add_hash(Ecore_Desktop_Tree * tree, Ecore_Hash * element, int free)
{
tree->elements =
(Ecore_Desktop_Tree_Element *) realloc(tree->elements,
sizeof
(Ecore_Desktop_Tree_Element));
tree->elements[tree->size].element = element;
+ if (free) tree->elements[tree->size].free = 1;
+ else tree->elements[tree->size].free = 0;
tree->elements[tree->size++].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_HASH;
return tree;
}
{
tree->elements[element].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL;
tree->elements[element].element = NULL;
+ tree->elements[element].free = 0;
}
}
moved = 1;
tree->elements[k].type = tree->elements[j].type;
tree->elements[k].element = tree->elements[j].element;
+ tree->elements[k].free = tree->elements[j].free;
tree->elements[j].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL;
tree->elements[j].element = NULL;
+ tree->elements[j].free = 0;
j++;
k++;
}
for (i = tree->size - 1; i >= 0; i--)
{
if (tree->elements[i].type == ECORE_DESKTOP_TREE_ELEMENT_TYPE_TREE)
- ecore_desktop_tree_del((Ecore_Desktop_Tree *) tree->elements[i].
- element);
- else if (tree->elements[i].type == ECORE_DESKTOP_TREE_ELEMENT_TYPE_HASH)
- ecore_hash_destroy((Ecore_Hash *) tree->elements[i].element);
+ ecore_desktop_tree_del((Ecore_Desktop_Tree *) tree->elements[i].element);
+ else if ((tree->elements[i].type == ECORE_DESKTOP_TREE_ELEMENT_TYPE_HASH) &&
+ (tree->elements[i].free))
+ ecore_hash_destroy((Ecore_Hash *) tree->elements[i].element);
}
E_FREE(tree->elements);