Carsten Haitzler (The Rasterman) wrote:
On Sat, 07 Jan 2006 04:24:35 +0100 Morten Nilsen <[EMAIL PROTECTED]> babbled:

David Seikel wrote:
Even if e_menu_category_callback_set() with the callback set to NULL was
implemented, there is no unique parameter in the function that would
identify which callback to remove.  There way be multiple callbacks
registered, that's why they are all added to a list.  And that's why we
usually call them add().
yes, when you add that bit of tale, I agree :) _set() lead me to believe the function only set one unique callback..

that indeed is almsot always the case in EFL. _set() will set 1 and 1 only item
(be it a callback, string, integer, boolean etc.) and _add() and _del() imply
there is a list of them to add to or delete from. :) so yes. i agree with dave
(fangie) :)


okay, I wrote up the code for add and set, but the cvs server is out of space on /tmp, so I can't make a patch against it...
I do have a clean tree locally, a few days old though..

patch attached :)

--
Morten
:wq
diff -ur enlightenment/e17/apps/e/src/bin/e_fileman_smart.c 
e/src/bin/e_fileman_smart.c
--- enlightenment/e17/apps/e/src/bin/e_fileman_smart.c  2006-01-01 
15:42:46.268631639 +0100
+++ e/src/bin/e_fileman_smart.c 2006-01-07 11:31:25.508256493 +0100
@@ -2,13 +2,6 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 #include "e.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <dirent.h>
-#include <pwd.h>
-#include <grp.h>
-#include <glob.h>
 
 /* TODO:
  *
@@ -80,150 +73,6 @@
 #define NEWL(str, it, type) \
    EET_DATA_DESCRIPTOR_ADD_LIST(_e_fm_dir_meta_edd, E_Fm_Dir_Metadata, str, 
it, type)
 
-typedef struct _E_Fm_Smart_Data            E_Fm_Smart_Data;
-typedef struct _E_Fm_Icon                  E_Fm_Icon;
-typedef struct _E_Fm_Icon_CFData           E_Fm_Icon_CFData;
-typedef struct _E_Fm_Config                E_Fm_Config;
-typedef struct _E_Fm_Dir_Metadata          E_Fm_Dir_Metadata;
-typedef struct _E_Fm_Fake_Mouse_Up_Info    E_Fm_Fake_Mouse_Up_Info;
-typedef enum   _E_Fm_Arrange               E_Fm_Arrange;
-
-struct _E_Fm_Config
-{
-   int width;
-   int height;
-};
-
-struct _E_Fm_Dir_Metadata
-{
-   char *name;             /* dir name */
-   char *bg;               /* dir's custom bg */
-   int   view;             /* dir's saved view type */
-   Evas_List *files;       /* files in dir */
-   
-   /* these are generated post-load */   
-   Evas_Hash *files_hash;  /* quick lookup hash */
-};
-
-struct _E_Fm_Icon
-{
-   E_Fm_File       *file;
-   Evas_Object     *icon_obj;
-   E_Fm_Smart_Data *sd;
-
-   struct {
-      unsigned char selected : 1;
-   } state;
-
-   E_Menu *menu;
-};
-
-struct _E_Fm_Icon_CFData
-{
-   /*- BASIC -*/
-   int protect;
-   int readwrite;
-   /*- ADVANCED -*/
-   struct {
-      int r;
-      int w;
-      int x;
-   } user, group, world;
-   /*- common -*/
-   E_Fm_Icon *icon;
-};
-
-enum _E_Fm_Arrange
-{
-   E_FILEMAN_CANVAS_ARRANGE_NAME = 0,
-   E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
-   E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
-};
-
-struct _E_Fm_Fake_Mouse_Up_Info
-{
-   Evas *canvas;
-   int button;
-};
-
-struct _E_Fm_Smart_Data
-{
-   E_Menu *menu;
-   E_Win *win;
-   Evas *evas;
-
-   Evas_Object *edje_obj;
-   Evas_Object *event_obj;   
-   Evas_Object *clip_obj;
-   Evas_Object *layout;
-   Evas_Object *object;
-   Evas_Object *entry_obj;
-
-   E_Fm_Dir_Metadata *meta;
-   
-   char *dir;
-   DIR  *dir2;
-   
-   double timer_int;
-   Ecore_Timer *timer;
-
-   Evas_List *event_handlers;
-
-   Evas_List *files;
-   Evas_List *files_raw;
-   Ecore_File_Monitor *monitor;
-   E_Fm_Arrange arrange;
-
-   int frozen;
-   double position;
-
-   int is_selector;
-   void (*selector_func) (Evas_Object *object, char *file, void *data);
-   void  *selector_data;
-   void (*selector_hilite_func) (Evas_Object *object, char *file, void *data);
-   
-   Evas_Coord x, y, w, h;
-
-   struct {
-      unsigned char start : 1;
-      int x, y;
-      Ecore_Evas *ecore_evas;
-      Evas *evas;
-      Ecore_X_Window win;
-      E_Fm_Icon *icon_obj;
-      Evas_Object *image_object;
-   } drag;
-
-   struct {
-      Evas_Coord x_space, y_space, w, h;
-   } icon_info;
-
-   struct {
-      Evas_Coord x, y, w, h;
-   } child;
-
-   struct {
-      Evas_List *files;
-      
-      struct {
-        E_Fm_Icon *file;
-        Evas_List *ptr;
-      } current;
-      
-      struct {
-        unsigned char enabled : 1;
-        Evas_Coord x, y;
-        Evas_Object *obj;
-        Evas_List *files;
-      } band;
-      
-   } selection;
-
-   struct {
-      E_Config_DD *main_edd;
-      E_Fm_Config *main;
-   } conf;
-};
 
 static void                _e_fm_smart_add(Evas_Object *object);
 static void                _e_fm_smart_del(Evas_Object *object);
@@ -1952,6 +1801,8 @@
        if (!sd->win) break;
 
        mn = e_menu_new();
+       e_menu_category_set(mn,"fileman/unknown");
+       e_menu_category_data_set("fileman/unknown",sd);
 
        sd->menu = mn;
 
@@ -1964,6 +1815,9 @@
                                 "fileman/button/arrange");
 
        mn = e_menu_new();
+       e_menu_category_set(mn,"fileman/unknown/arrange");
+       e_menu_category_data_set("fileman/unknown/arrange",sd);
+
        e_menu_item_submenu_set(mi, mn);
 
        mi = e_menu_item_new(mn);
@@ -1996,6 +1850,9 @@
                                 "fileman/button/new");
 
        mn = e_menu_new();
+       e_menu_category_set(mn,"fileman/unknown/new");
+       e_menu_category_data_set("fileman/unknown/new",sd);
+       
        e_menu_item_submenu_set(mi, mn);
 
        mi = e_menu_item_new(mn);
@@ -2014,6 +1871,9 @@
                                 "fileman/button/view");
 
        mn = e_menu_new();
+       e_menu_category_set(mn,"fileman/unknown/view");
+       e_menu_category_data_set("fileman/unknown/view",sd);
+
        e_menu_item_submenu_set(mi, mn);
 
        mi = e_menu_item_new(mn);
@@ -2243,6 +2103,9 @@
        _e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
 
        mn = e_menu_new();
+        e_menu_category_set(mn,"fileman/action");
+        e_menu_category_data_set("fileman/action",icon);
+       
        mi = e_menu_item_new(mn);
        e_menu_item_label_set(mi, _("Open"));
        e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
diff -ur enlightenment/e17/apps/e/src/bin/e_fileman_smart.h 
e/src/bin/e_fileman_smart.h
--- enlightenment/e17/apps/e/src/bin/e_fileman_smart.h  2005-12-06 
08:25:15.253761541 +0100
+++ e/src/bin/e_fileman_smart.h 2006-01-07 11:31:25.512256730 +0100
@@ -1,6 +1,15 @@
 /*
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <dirent.h>
+#include <pwd.h>
+#include <grp.h>
+#include <glob.h>
+
+
 #ifdef E_TYPEDEFS
 
 typedef struct _E_Event_Fm_Reconfigure      E_Event_Fm_Reconfigure;
@@ -22,6 +31,151 @@
    Evas_Coord w, h;  
 };
 
+typedef struct _E_Fm_Smart_Data            E_Fm_Smart_Data;
+typedef struct _E_Fm_Icon                  E_Fm_Icon;
+typedef struct _E_Fm_Icon_CFData           E_Fm_Icon_CFData;
+typedef struct _E_Fm_Config                E_Fm_Config;
+typedef struct _E_Fm_Dir_Metadata          E_Fm_Dir_Metadata;
+typedef struct _E_Fm_Fake_Mouse_Up_Info    E_Fm_Fake_Mouse_Up_Info;
+typedef enum   _E_Fm_Arrange               E_Fm_Arrange;
+
+struct _E_Fm_Config
+{
+   int width;
+   int height;
+};
+
+struct _E_Fm_Dir_Metadata
+{
+   char *name;             /* dir name */
+   char *bg;               /* dir's custom bg */
+   int   view;             /* dir's saved view type */
+   Evas_List *files;       /* files in dir */
+   
+   /* these are generated post-load */   
+   Evas_Hash *files_hash;  /* quick lookup hash */
+};
+
+struct _E_Fm_Icon
+{
+   E_Fm_File       *file;
+   Evas_Object     *icon_obj;
+   E_Fm_Smart_Data *sd;
+
+   struct {
+      unsigned char selected : 1;
+   } state;
+
+   E_Menu *menu;
+};
+
+struct _E_Fm_Icon_CFData
+{
+   /*- BASIC -*/
+   int protect;
+   int readwrite;
+   /*- ADVANCED -*/
+   struct {
+      int r;
+      int w;
+      int x;
+   } user, group, world;
+   /*- common -*/
+   E_Fm_Icon *icon;
+};
+
+enum _E_Fm_Arrange
+{
+   E_FILEMAN_CANVAS_ARRANGE_NAME = 0,
+   E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
+   E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
+};
+
+struct _E_Fm_Fake_Mouse_Up_Info
+{
+   Evas *canvas;
+   int button;
+};
+
+struct _E_Fm_Smart_Data
+{
+   E_Menu *menu;
+   E_Win *win;
+   Evas *evas;
+
+   Evas_Object *edje_obj;
+   Evas_Object *event_obj;   
+   Evas_Object *clip_obj;
+   Evas_Object *layout;
+   Evas_Object *object;
+   Evas_Object *entry_obj;
+
+   E_Fm_Dir_Metadata *meta;
+   
+   char *dir;
+   DIR  *dir2;
+   
+   double timer_int;
+   Ecore_Timer *timer;
+
+   Evas_List *event_handlers;
+
+   Evas_List *files;
+   Evas_List *files_raw;
+   Ecore_File_Monitor *monitor;
+   E_Fm_Arrange arrange;
+
+   int frozen;
+   double position;
+
+   int is_selector;
+   void (*selector_func) (Evas_Object *object, char *file, void *data);
+   void  *selector_data;
+   void (*selector_hilite_func) (Evas_Object *object, char *file, void *data);
+   
+   Evas_Coord x, y, w, h;
+
+   struct {
+      unsigned char start : 1;
+      int x, y;
+      Ecore_Evas *ecore_evas;
+      Evas *evas;
+      Ecore_X_Window win;
+      E_Fm_Icon *icon_obj;
+      Evas_Object *image_object;
+   } drag;
+
+   struct {
+      Evas_Coord x_space, y_space, w, h;
+   } icon_info;
+
+   struct {
+      Evas_Coord x, y, w, h;
+   } child;
+
+   struct {
+      Evas_List *files;
+      
+      struct {
+        E_Fm_Icon *file;
+        Evas_List *ptr;
+      } current;
+      
+      struct {
+        unsigned char enabled : 1;
+        Evas_Coord x, y;
+        Evas_Object *obj;
+        Evas_List *files;
+      } band;
+      
+   } selection;
+
+   struct {
+      E_Config_DD *main_edd;
+      E_Fm_Config *main;
+   } conf;
+};
+
 EAPI int                   e_fm_init(void);
 EAPI int                   e_fm_shutdown(void);
 EAPI Evas_Object          *e_fm_add(Evas *evas);
diff -ur enlightenment/e17/apps/e/src/bin/e_int_border_menu.c 
e/src/bin/e_int_border_menu.c
--- enlightenment/e17/apps/e/src/bin/e_int_border_menu.c        2005-12-04 
14:32:39.475412427 +0100
+++ e/src/bin/e_int_border_menu.c       2006-01-07 11:31:25.512256730 +0100
@@ -34,6 +34,8 @@
    if (bd->border_menu) return;
    
    m = e_menu_new();
+   e_menu_category_set(m,"border/stacking");
+   e_menu_category_data_set("border/stacking",bd);
    bd->border_stacking_menu = m;
    /* Only allow to change layer for windows in "normal" layers */
    if ((!bd->lock_user_stacking) &&
@@ -72,6 +74,8 @@
      }
 
    m = e_menu_new();
+   e_menu_category_set(m,"border/maximize");
+   e_menu_category_data_set("border/maximize",bd);
    bd->border_maximize_menu = m;
    /* Only allow to change layer for windows in "normal" layers */
    if ((!bd->lock_user_maximize) &&
@@ -121,6 +125,8 @@
    }
 
    m = e_menu_new();
+   e_menu_category_set(m,"border");
+   e_menu_category_data_set("border",bd);
    e_object_data_set(E_OBJECT(m), bd);
    bd->border_menu = m;
    e_menu_post_deactivate_callback_set(m, _e_border_cb_border_menu_end, NULL);
diff -ur enlightenment/e17/apps/e/src/bin/e_int_menus.c e/src/bin/e_int_menus.c
--- enlightenment/e17/apps/e/src/bin/e_int_menus.c      2006-01-05 
09:31:04.567715507 +0100
+++ e/src/bin/e_int_menus.c     2006-01-07 11:31:25.512256730 +0100
@@ -72,6 +72,7 @@
    
    dat = calloc(1, sizeof(Main_Data));
    m = e_menu_new();
+   e_menu_category_set(m,"main");
    dat->menu = m;
    e_object_data_set(E_OBJECT(m), dat);   
    e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_main_del_hook);
diff -ur enlightenment/e17/apps/e/src/bin/e_menu.c e/src/bin/e_menu.c
--- enlightenment/e17/apps/e/src/bin/e_menu.c   2006-01-01 15:42:48.308753168 
+0100
+++ e/src/bin/e_menu.c  2006-01-07 11:43:25.054986869 +0100
@@ -23,6 +23,23 @@
  * * support obscures to indicate offscreen/not visible menu parts
  */
 
+/* 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
+{
+       void *data;
+       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);
@@ -69,10 +86,13 @@
 static int  _e_menu_cb_window_shape               (void *data, int ev_type, 
void *ev);
 
 static void _e_menu_cb_item_submenu_post_default  (void *data, E_Menu *m, 
E_Menu_Item *mi);
+static Evas_Bool _e_menu_categories_free_cb(Evas_Hash *hash, const char *key, 
void *data, void *fdata);
 
 /* local subsystem globals */
 static Ecore_X_Window       _e_menu_win                 = 0;
 static Evas_List           *_e_active_menus             = NULL;
+/*static Evas_Hash        *_e_menu_category_items      = NULL;*/
+static Evas_Hash          *_e_menu_categories          = NULL;
 static Ecore_X_Time         _e_menu_activate_time       = 0;
 static int                  _e_menu_activate_floating   = 0;
 static Ecore_Timer         *_e_menu_scroll_timer        = NULL;
@@ -128,6 +148,13 @@
        e_object_unref(E_OBJECT(m));
      }
    _e_active_menus = NULL;
+   if (_e_menu_categories)
+     {
+       evas_hash_foreach(_e_menu_categories, _e_menu_categories_free_cb, NULL);
+       evas_hash_free(_e_menu_categories);
+       _e_menu_categories = NULL;
+     }
+  
    return 1;
 }
 
@@ -140,9 +167,11 @@
    if (!m) return NULL;
    m->cur.w = 1;
    m->cur.h = 1;
+   m->category = NULL;
    return m;
 }
 
+
 void
 e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int 
dir)
 {
@@ -341,6 +370,79 @@
 }
 
 void
+e_menu_category_set(E_Menu *m, char *category)
+{
+   E_OBJECT_CHECK(m);
+   E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
+   if (m->category)
+     {
+       evas_stringshare_del(m->category);
+       m->category = NULL;
+     }
+   if (category) m->category = evas_stringshare_add(category);
+   else m->category = NULL;
+   m->changed = 1;
+}
+void
+e_menu_category_data_set(char *category, void *data)
+{
+   E_Menu_Category *cat;
+   
+   cat = evas_hash_find(_e_menu_categories, category);
+   if (cat)
+       cat->data = data;
+   /* if it isnt found create the new hash */
+   else
+     {
+       cat = calloc(1, sizeof(E_Menu_Category));
+       cat->data = data;
+       _e_menu_categories = evas_hash_add(_e_menu_categories,category,cat);
+     }
+}
+
+void *
+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;
+   
+   cat = evas_hash_find(_e_menu_categories, category);
+   /* if it isnt found create the new hash */
+   if (!cat)
+     {
+       cat = calloc(1, sizeof(E_Menu_Category));
+       _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);
+
+   return (void *) cb;
+}
+
+void
+e_menu_category_callback_del(char *category, void *handle)
+{
+   E_Menu_Category *cat;
+   E_Menu_Category_Callback *cb;
+
+   cat = evas_hash_find(_e_menu_categories, category);
+   if (!cat)
+     return NULL;
+
+   cb = evas_list_find(cat->callbacks, handle);
+
+   cat->callbacks = evas_list_remove(cat->callbacks, cb);
+
+   if(cb->free)
+     cb->free(cb->data);
+
+   free(cb);
+}
+
+void
 e_menu_pre_activate_callback_set(E_Menu *m, void (*func) (void *data, E_Menu 
*m), void *data)
 {
    E_OBJECT_CHECK(m);
@@ -402,6 +504,7 @@
    int i;
    
    E_OBJECT_CHECK_RETURN(mi, -1);
+   E_OBJECT_CHECK_RETURN(m->menu, -1);
    E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_TYPE, -1);
    for (i = 0, l = mi->menu->items; l; l = l->next, i++)
      {
@@ -847,7 +950,20 @@
 _e_menu_free(E_Menu *m)
 {
    Evas_List *l, *tmp;
+   E_Menu_Category *cat;
    
+   /* the foreign menu items */
+   cat = evas_hash_find(_e_menu_categories, m->category);
+   if(cat)
+   {
+       for(l = cat->callbacks; l; l = l->next)
+       {
+               E_Menu_Category_Callback *cb;
+
+               cb = l->data;
+               if(cb->free) cb->free(cb->data);
+       }
+   }
    _e_menu_unrealize(m);
    E_FREE(m->shape_rects);
    m->shape_rects_num = 0;
@@ -885,6 +1001,21 @@
 }
 
 static void
+_e_menu_category_item_free(E_Menu_Item *mi)
+{
+   if (mi->submenu)
+     {
+       mi->submenu->parent_item = NULL;
+       e_object_unref(E_OBJECT(mi->submenu));
+     }
+   if (mi->menu->realized) _e_menu_item_unrealize(mi);
+   if (mi->icon) evas_stringshare_del(mi->icon);
+   if (mi->icon_key) evas_stringshare_del(mi->icon_key);
+   if (mi->label) evas_stringshare_del(mi->label);
+   free(mi);
+}
+
+static void
 _e_menu_cb_intercept_item_move(void *data, Evas_Object *o, Evas_Coord x, 
Evas_Coord y)
 {
    E_Menu_Item *mi;
@@ -1155,6 +1286,9 @@
 {
    Evas_Object *o;
    Evas_List *l;
+   E_Menu_Category *cat;
+
+   
    int ok;
    
    if (m->realized) return;
@@ -1212,6 +1346,7 @@
    e_box_homogenous_set(o, 0);
    edje_object_part_swallow(m->bg_object, "items", m->container_object);
    
+   
    for (l = m->items; l; l = l->next)
      {
        E_Menu_Item *mi;
@@ -1219,7 +1354,7 @@
        mi = l->data;
        _e_menu_item_realize(mi);
      }
-   
+
    o = m->container_object;
    _e_menu_items_layout_update(m);
    e_box_thaw(o);
@@ -1452,6 +1587,7 @@
 static void
 _e_menu_unrealize(E_Menu *m)
 {
+   E_Menu_Category *cat;
    Evas_List *l;
    
    if (!m->realized) return;
@@ -1460,6 +1596,7 @@
    e_object_del(E_OBJECT(m->shape));
    m->shape = NULL;
    e_box_freeze(m->container_object);
+   
    for (l = m->items; l; l = l->next)
      {
        E_Menu_Item *mi;
@@ -1487,6 +1624,9 @@
 static void
 _e_menu_activate_internal(E_Menu *m, E_Zone *zone)
 {
+   Evas_List *l;
+   E_Menu_Category *cat;
+
    if (m->pre_activate_cb.func)
      m->pre_activate_cb.func(m->pre_activate_cb.data, m);
    m->fast_mouse = 0;
@@ -1519,6 +1659,18 @@
        m->active = 1;
        e_object_ref(E_OBJECT(m));
      }
+   /* the foreign menu items */
+   cat = evas_hash_find(_e_menu_categories, m->category);
+   if(cat)
+   {
+       for(l = cat->callbacks; l; l = l->next)
+       {
+               E_Menu_Category_Callback *cb;
+
+               cb = l->data;
+               if(cb->create) cb->create(m,cat->data,cb->data);
+       }
+   }
    m->cur.visible = 1;
    m->zone = zone;
 }
@@ -2473,3 +2625,20 @@
    e_menu_item_submenu_set(mi, NULL);
    e_object_del(E_OBJECT(subm));
 }
+
+
+static Evas_Bool _e_menu_categories_free_cb(Evas_Hash *hash, const char *key, 
void *data, void *fdata)
+{
+   Evas_List *l;
+   E_Menu_Category *cat;
+   
+   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);
+     }
+   free(cat);
+}
+
diff -ur enlightenment/e17/apps/e/src/bin/e_menu.h e/src/bin/e_menu.h
--- enlightenment/e17/apps/e/src/bin/e_menu.h   2005-07-27 02:01:42.979338976 
+0200
+++ e/src/bin/e_menu.h  2006-01-07 11:44:47.939910840 +0100
@@ -26,6 +26,8 @@
 {
    E_Object             e_obj_inherit;
    
+   char *              category;
+
    struct {
       char              visible : 1;
       int               x, y, w, h;
@@ -140,6 +142,13 @@
 EAPI int          e_menu_thaw(E_Menu *m);
 EAPI void         e_menu_title_set(E_Menu *m, char *title);
 EAPI void         e_menu_icon_file_set(E_Menu *m, char *icon);
+
+/* 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_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(char *category, void *handle);
+       
 EAPI void         e_menu_pre_activate_callback_set(E_Menu *m,  void (*func) 
(void *data, E_Menu *m), void *data);
 EAPI void         e_menu_post_deactivate_callback_set(E_Menu *m,  void (*func) 
(void *data, E_Menu *m), void *data);
 

Reply via email to