On 1/7/06, Morten Nilsen <[EMAIL PROTECTED]> wrote:
> 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);
>
>
>
Your efm is kind of old, also you shouldnt make changes to it because
the problem is on the "client" api (_callback_set) on the e_menu.c
On _callback_del you expect a handle to be passed, by the code i
suspect it is a E_Menu_Category_Callback struct, but the client doesnt
have this struct, it is only internal to the e_menu.c so it must
receive again the callback for create and the callback for free as in
the _callback_set, iterate through the list and compare the pointers,
if its found delete it from the list. Also the definition is wrong
compared to the prototype of the function.
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_idv37&alloc_id865&op=click
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel