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);
valgrind_log.pid15451
Description: Binary data
pgpSqzD7b0xMg.pgp
Description: PGP signature
