From a1865b0d304fc1bb960c21312dd5eb8eb8e93e14 Mon Sep 17 00:00:00 2001 From: sebastid Date: Sun, 24 Sep 2006 11:17:03 +0000 Subject: [PATCH] *** empty log message *** SVN revision: 26089 --- .../src/lib/ecore_desktop/Ecore_Desktop.h | 4 +++- .../lib/ecore_desktop/ecore_desktop_menu.c | 15 +++++++----- .../lib/ecore_desktop/ecore_desktop_tree.c | 23 ++++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h index af317ff1f9..7d0babaa17 100644 --- a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h +++ b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h @@ -122,6 +122,7 @@ struct _Ecore_Desktop_Tree_Element { 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; @@ -244,7 +245,8 @@ extern "C" 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, diff --git a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c index c874ca94b0..86d1912ac5 100644 --- a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c +++ b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c @@ -151,7 +151,7 @@ ecore_desktop_menu_for_each(void (*func) 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); } @@ -337,6 +337,7 @@ _ecore_desktop_menu_unxml(const void *data, Ecore_Desktop_Tree * tree, 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, "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; @@ -369,6 +371,7 @@ _ecore_desktop_menu_unxml(const void *data, Ecore_Desktop_Tree * tree, tree->elements[i].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL; tree->elements[i].element = NULL; + tree->elements[i].free = 0; } else if (strcmp @@ -631,9 +634,9 @@ _ecore_desktop_menu_create_menu() ecore_hash_set_free_value(apps, free); ecore_desktop_tree_extend(menu, " <> <>"); ecore_desktop_tree_extend(menu, "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 { @@ -1586,7 +1589,7 @@ _ecore_desktop_menu_select_app(void *value, void *user_data) 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 " : ""), diff --git a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_tree.c b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_tree.c index dd7f9cbea2..eb68fcb844 100644 --- a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_tree.c +++ b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_tree.c @@ -62,7 +62,8 @@ ecore_desktop_tree_add(Ecore_Desktop_Tree * tree, char *element) 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; } @@ -106,9 +107,11 @@ ecore_desktop_tree_insert(Ecore_Desktop_Tree * tree, int before, void *element, { 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; } @@ -133,11 +136,13 @@ ecore_desktop_tree_merge(Ecore_Desktop_Tree * tree, int before, { 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; } } @@ -169,13 +174,14 @@ ecore_desktop_tree_add_child(Ecore_Desktop_Tree * tree, 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, @@ -184,6 +190,8 @@ ecore_desktop_tree_add_hash(Ecore_Desktop_Tree * tree, Ecore_Hash * element) 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; } @@ -195,6 +203,7 @@ ecore_desktop_tree_remove(Ecore_Desktop_Tree * tree, int element) { tree->elements[element].type = ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL; tree->elements[element].element = NULL; + tree->elements[element].free = 0; } } @@ -255,8 +264,10 @@ ecore_desktop_tree_foreach(Ecore_Desktop_Tree * tree, int level, 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++; } @@ -351,10 +362,10 @@ ecore_desktop_tree_del(Ecore_Desktop_Tree * tree) 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);