Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_int_menus.c e_int_menus.h e_object.c e_object.h e_zone.c Log Message: fix main int menus to fre, del, cleanup, not leak and work properly =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_int_menus.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- e_int_menus.c 12 Jan 2005 08:45:28 -0000 1.29 +++ e_int_menus.c 12 Jan 2005 09:22:44 -0000 1.30 @@ -15,13 +15,13 @@ }; /* local subsystem functions */ -static void _e_int_menus_main_end (void *data, E_Menu *m); +static void _e_int_menus_main_del_hook (void *obj); static void _e_int_menus_main_about (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_restart (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_exit (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_apps_scan (E_Menu *m); static void _e_int_menus_apps_start (void *data, E_Menu *m); -static void _e_int_menus_apps_end (void *data, E_Menu *m); +static void _e_int_menus_apps_del_hook (void *obj); static void _e_int_menus_apps_free_hook (void *obj); static void _e_int_menus_apps_run (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m); @@ -45,10 +45,10 @@ dat = calloc(1, sizeof(Main_Data)); m = e_menu_new(); 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); - e_menu_post_deactivate_callback_set(m, _e_int_menus_main_end, dat); - - subm = e_int_menus_favorite_apps_new(0); + subm = e_int_menus_favorite_apps_new(); dat->apps = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, "Favorite Applications"); @@ -110,7 +110,7 @@ } E_Menu * -e_int_menus_apps_new(char *dir, int top) +e_int_menus_apps_new(char *dir) { E_Menu *m; E_App *a; @@ -119,11 +119,8 @@ a = e_app_new(dir, 0); e_object_data_set(E_OBJECT(m), a); e_menu_pre_activate_callback_set(m, _e_int_menus_apps_start, NULL); - if (top) - { - e_menu_post_deactivate_callback_set(m, _e_int_menus_apps_end, NULL); - e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_apps_free_hook); - } + e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_apps_del_hook); + e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_apps_free_hook); return m; } @@ -139,7 +136,7 @@ E_Menu * -e_int_menus_favorite_apps_new(int top) +e_int_menus_favorite_apps_new(void) { E_Menu *m; char buf[4096]; @@ -149,7 +146,7 @@ if (homedir) { snprintf(buf, sizeof(buf), "%s/.e/e/applications/favorite", homedir); - m = e_int_menus_apps_new(buf, top); + m = e_int_menus_apps_new(buf); free(homedir); return m; } @@ -168,17 +165,21 @@ /* local subsystem functions */ static void -_e_int_menus_main_end(void *data, E_Menu *m) +_e_int_menus_main_del_hook(void *obj) { Main_Data *dat; + E_Menu *m; - dat = data; - e_object_del(E_OBJECT(dat->apps)); - e_object_del(E_OBJECT(dat->modules)); - e_object_del(E_OBJECT(dat->desktops)); - e_object_del(E_OBJECT(dat->clients)); - e_object_del(E_OBJECT(m)); - free(dat); + m = obj; + dat = e_object_data_get(E_OBJECT(obj)); + if (dat) + { + e_object_del(E_OBJECT(dat->apps)); + e_object_del(E_OBJECT(dat->modules)); + e_object_del(E_OBJECT(dat->desktops)); + e_object_del(E_OBJECT(dat->clients)); + free(dat); + } } static void @@ -235,7 +236,7 @@ snprintf(buf, sizeof(buf), "%s/.directory.eet", a->path); e_menu_item_icon_edje_set(mi, buf, "icon"); - e_menu_item_submenu_set(mi, e_int_menus_apps_new(a->path, 0)); + e_menu_item_submenu_set(mi, e_int_menus_apps_new(a->path)); app_count++; } } @@ -254,19 +255,19 @@ } static void -_e_int_menus_apps_end(void *data, E_Menu *m) +_e_int_menus_apps_del_hook(void *obj) { + E_Menu *m; Evas_List *l; + m = obj; for (l = m->items; l; l = l->next) { E_Menu_Item *mi; mi = l->data; - if (mi->submenu) - _e_int_menus_apps_end(NULL, mi->submenu); + if (mi->submenu) e_object_del(mi->submenu); } - e_object_del(E_OBJECT(m)); } static void =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_int_menus.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- e_int_menus.h 3 Jan 2005 09:34:24 -0000 1.6 +++ e_int_menus.h 12 Jan 2005 09:22:44 -0000 1.7 @@ -4,7 +4,7 @@ EAPI E_Menu *e_int_menus_main_new(void); EAPI E_Menu *e_int_menus_desktops_new(void); EAPI E_Menu *e_int_menus_clients_new(void); -EAPI E_Menu *e_int_menus_apps_new(char *dir, int top); -EAPI E_Menu *e_int_menus_favorite_apps_new(int top); +EAPI E_Menu *e_int_menus_apps_new(char *dir); +EAPI E_Menu *e_int_menus_favorite_apps_new(void); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_object.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- e_object.c 3 Jan 2005 22:04:04 -0000 1.3 +++ e_object.c 12 Jan 2005 09:22:44 -0000 1.4 @@ -45,6 +45,7 @@ { E_OBJECT_CHECK(obj); obj->deleted = 1; + if (obj->del_att_func) obj->del_att_func(obj); if (obj->del_func) obj->del_func(obj); e_object_unref(obj); } @@ -67,7 +68,7 @@ e_object_free(E_Object *obj) { E_OBJECT_CHECK(obj); - if (obj->func) obj->func(obj); + if (obj->free_att_func) obj->free_att_func(obj); obj->magic = E_OBJECT_MAGIC_FREED; obj->cleanup_func(obj); } @@ -217,7 +218,14 @@ e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj)) { E_OBJECT_CHECK(obj); - obj->func = func; + obj->free_att_func = func; +} + +void +e_object_del_attach_func_set(E_Object *obj, void (*func) (void *obj)) +{ + E_OBJECT_CHECK(obj); + obj->del_att_func = func; } #ifdef OBJECT_PARANOIA_CHECK =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_object.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- e_object.h 4 Jan 2005 01:32:23 -0000 1.8 +++ e_object.h 12 Jan 2005 09:22:44 -0000 1.9 @@ -50,7 +50,8 @@ int references; E_Object_Cleanup_Func del_func; E_Object_Cleanup_Func cleanup_func; - void (*func) (void *obj); + void (*free_att_func) (void *obj); + void (*del_att_func) (void *obj); void *data; unsigned char deleted : 1; }; @@ -67,5 +68,6 @@ EAPI void e_object_data_set (E_Object *obj, void *data); EAPI void *e_object_data_get (E_Object *obj); EAPI void e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj)); +EAPI void e_object_del_attach_func_set (E_Object *obj, void (*func) (void *obj)); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_zone.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- e_zone.c 11 Jan 2005 13:43:00 -0000 1.14 +++ e_zone.c 12 Jan 2005 09:22:44 -0000 1.15 @@ -8,6 +8,7 @@ */ static void _e_zone_free(E_Zone *zone); +static void _e_zone_cb_menu_end(void *data, E_Menu *m); static void _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_zone_cb_bg_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info); @@ -207,6 +208,12 @@ } static void +_e_zone_cb_menu_end(void *data, E_Menu *m) +{ + e_object_del(E_OBJECT(m)); +} + +static void _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) { E_Zone *zone; @@ -221,6 +228,7 @@ E_Menu *m; m = e_int_menus_main_new(); + e_menu_post_deactivate_callback_set(m, _e_zone_cb_menu_end, NULL); e_menu_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN); e_util_container_fake_mouse_up_all_later(zone->container); @@ -232,6 +240,7 @@ m = e_int_menus_clients_new(); /* FIXME: this is a bit of a hack... setting m->con - bad hack */ m->zone = zone; + e_menu_post_deactivate_callback_set(m, _e_zone_cb_menu_end, NULL); e_menu_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN); e_util_container_fake_mouse_up_all_later(zone->container); @@ -240,7 +249,8 @@ { E_Menu *m; - m = e_int_menus_favorite_apps_new(1); + m = e_int_menus_favorite_apps_new(); + e_menu_post_deactivate_callback_set(m, _e_zone_cb_menu_end, NULL); e_menu_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN); e_util_container_fake_mouse_up_all_later(zone->container); ------------------------------------------------------- The SF.Net email is sponsored by: Beat the post-holiday blues Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek. It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs