/* 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
{
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);
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;
}
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
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);
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;
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;
}
-
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
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);
/* 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);