*** empty log message ***
authorsebastid <sebastid>
Sun, 24 Sep 2006 11:17:03 +0000 (11:17 +0000)
committersebastid <sebastid@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 24 Sep 2006 11:17:03 +0000 (11:17 +0000)
SVN revision: 26089

legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h
legacy/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c
legacy/ecore/src/lib/ecore_desktop/ecore_desktop_tree.c

index af317ff..7d0baba 100644 (file)
@@ -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,
index c874ca9..86d1912 100644 (file)
@@ -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, "<Menu") == 0)
          {
@@ -355,6 +356,7 @@ _ecore_desktop_menu_unxml(const void *data, Ecore_Desktop_Tree * tree,
                  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;
@@ -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, "<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
      {
@@ -1467,9 +1470,9 @@ _ecore_desktop_menu_generate(const void *data, Ecore_Desktop_Tree * tree,
                    {
                       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
                    {
@@ -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 " : ""),
index dd7f9cb..eb68fcb 100644 (file)
@@ -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);