On Sun, 8 Jan 2006 16:17:52 +1000 David Seikel <[EMAIL PROTECTED]>
wrote:

> I'll probably post it here as a patch and leave it up to raster or
> CodeWarrior to actually commit it.

So here it is.  Not much different from what Morten had in mind.  I
ended up not using the delete_me stuff, it wasn't needed for my tests,
but it may still be needed.

There are also some formatting fixes.

There was an intermittent segfault during testing, not sure if it is
actually related though.  There are errors reported by valgrind that
don't look related.  I've also attached the valgrind output.
Index: e_menu.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.c,v
retrieving revision 1.46
diff -u -r1.46 e_menu.c
--- e_menu.c	7 Jan 2006 17:38:13 -0000	1.46
+++ e_menu.c	8 Jan 2006 11:45:00 -0000
@@ -25,7 +25,6 @@
 
 /* local subsystem data types */
 typedef struct _E_Menu_Category E_Menu_Category;
-typedef struct _E_Menu_Category_Callback E_Menu_Category_Callback;
 
 struct _E_Menu_Category
 {
@@ -33,13 +32,6 @@
 	Evas_List *callbacks;
 };
 
-struct _E_Menu_Category_Callback
-{
-	void *data;
-	void (*create) (E_Menu *m, void *category_data, void *data);	
-	void (*free) (void *data);	
-};
-
 /* local subsystem functions */
 static void _e_menu_free                          (E_Menu *m);
 static void _e_menu_item_free                     (E_Menu_Item *mi);
@@ -379,8 +371,10 @@
 	evas_stringshare_del(m->category);
 	m->category = NULL;
      }
-   if (category) m->category = evas_stringshare_add(category);
-   else m->category = NULL;
+   if (category)
+      m->category = evas_stringshare_add(category);
+   else
+      m->category = NULL;
    m->changed = 1;
 }
 
@@ -392,33 +386,54 @@
    cat = evas_hash_find(_e_menu_categories, category);
    if (cat)
    	cat->data = data;
-   /* if it isnt found create the new hash */
-   else
+   else   /* if it isnt found create the new hash */
      {
 	cat = calloc(1, sizeof(E_Menu_Category));
 	cat->data = data;
-	_e_menu_categories = evas_hash_add(_e_menu_categories,category,cat);
+	_e_menu_categories = evas_hash_add(_e_menu_categories, category, cat);
      }
 }
 
-EAPI void
-e_menu_category_callback_set(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (*free) (void *data), void *data)
+EAPI E_Menu_Category_Callback *
+e_menu_category_callback_add(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (*free) (void *data), void *data)
 {
    E_Menu_Category *cat;
-   E_Menu_Category_Callback *cb;
+   E_Menu_Category_Callback *cb = NULL;
    
    cat = evas_hash_find(_e_menu_categories, category);
-   /* if it isnt found create the new hash */
-   if (!cat)
+   if (!cat)   /* if it isnt found create the new hash */
      {
 	cat = calloc(1, sizeof(E_Menu_Category));
-	_e_menu_categories = evas_hash_add(_e_menu_categories,category,cat);
+	_e_menu_categories = evas_hash_add(_e_menu_categories, category, cat);
      }
-   cb = calloc(1, sizeof(E_Menu_Category_Callback));
-   cb->data = data;
-   cb->create = create;
-   cb->free = free;
-   cat->callbacks = evas_list_append(cat->callbacks,cb);
+   if (cat)
+      {
+         cb = calloc(1, sizeof(E_Menu_Category_Callback));
+	 if (cb)
+	    {
+               cb->data = data;
+               cb->create = create;
+               cb->free = free;
+	       cb->category = evas_stringshare_add(category);
+               cat->callbacks = evas_list_append(cat->callbacks, cb);
+	    }
+      }
+   return cb;
+}
+
+EAPI void
+e_menu_category_callback_del(E_Menu_Category_Callback *cb)
+{
+   E_Menu_Category *cat;
+
+   if (cb)
+      {
+         cat = evas_hash_find(_e_menu_categories, cb->category);
+	 if (cat)
+            cat->callbacks = evas_list_remove(cat->callbacks, cb);
+         evas_stringshare_del(cb->category);
+         free(cb);
+      }
 }
 
 EAPI void
@@ -940,7 +955,7 @@
 		E_Menu_Category_Callback *cb;
 
 		cb = l->data;
-		if(cb->free) cb->free(cb->data);
+		if(cb->free)   cb->free(cb->data);
 	}
    }
    _e_menu_unrealize(m);
@@ -1644,7 +1659,7 @@
 		E_Menu_Category_Callback *cb;
 
 		cb = l->data;
-		if(cb->create) cb->create(m,cat->data,cb->data);
+		if(cb->create)   cb->create(m, cat->data, cb->data);
 	}
    }
    m->cur.visible = 1;
@@ -2609,14 +2624,13 @@
    Evas_List *l;
    E_Menu_Category *cat;
    
-   cat = (E_Menu_Category *)data;
-   l = (Evas_List *)cat->callbacks;
+   cat = (E_Menu_Category *) data;
+   l = (Evas_List *) cat->callbacks;
    while (l)
      {
 	free(l->data); /* free the callback struct */
-	l = evas_list_remove_list(l,l);
+	l = evas_list_remove_list(l, l);
      }
    free(cat);
    return 1;
 }
-
Index: e_menu.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.h,v
retrieving revision 1.15
diff -u -r1.15 e_menu.h
--- e_menu.h	6 Jan 2006 23:45:13 -0000	1.15
+++ e_menu.h	8 Jan 2006 11:45:00 -0000
@@ -13,6 +13,8 @@
 
 typedef struct _E_Menu         E_Menu;
 typedef struct _E_Menu_Item    E_Menu_Item;
+typedef struct _E_Menu_Category_Callback E_Menu_Category_Callback;
+
 
 #else
 #ifndef E_MENU_H
@@ -130,6 +132,15 @@
    unsigned char  active : 1;
 };
 
+struct _E_Menu_Category_Callback
+{
+   const char *category;
+   void *data;
+   void (*create) (E_Menu *m, void *category_data, void *data);	
+   void (*free) (void *data);	
+};
+
+
 EAPI int          e_menu_init(void);
 EAPI int          e_menu_shutdown(void);
 
@@ -146,7 +157,8 @@
 /* menu categories functions */
 EAPI void         e_menu_category_set(E_Menu *m, char *category);
 EAPI void         e_menu_category_data_set(char *category, void *data);
-EAPI void         e_menu_category_callback_set(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (free) (void *data), void *data);
+EAPI E_Menu_Category_Callback  *e_menu_category_callback_add(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (free) (void *data), void *data);
+EAPI void         e_menu_category_callback_del(E_Menu_Category_Callback *cb);
 
 	
 EAPI void         e_menu_pre_activate_callback_set(E_Menu *m,  void (*func) (void *data, E_Menu *m), void *data);

Attachment: valgrind_log.pid15451
Description: Binary data

Attachment: pgpSqzD7b0xMg.pgp
Description: PGP signature

Reply via email to