fix main int menus to fre, del, cleanup, not leak and work properly

SVN revision: 12919
This commit is contained in:
Carsten Haitzler 2005-01-12 09:22:44 +00:00
parent 5e2d06b0ff
commit 7d0f9c8df9
5 changed files with 53 additions and 32 deletions

View File

@ -15,13 +15,13 @@ struct _Main_Data
}; };
/* local subsystem functions */ /* 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_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_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_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_scan (E_Menu *m);
static void _e_int_menus_apps_start (void *data, 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_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_apps_run (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m); static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m);
@ -45,10 +45,10 @@ e_int_menus_main_new(void)
dat = calloc(1, sizeof(Main_Data)); dat = calloc(1, sizeof(Main_Data));
m = e_menu_new(); m = e_menu_new();
dat->menu = m; 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();
subm = e_int_menus_favorite_apps_new(0);
dat->apps = subm; dat->apps = subm;
mi = e_menu_item_new(m); mi = e_menu_item_new(m);
e_menu_item_label_set(mi, "Favorite Applications"); e_menu_item_label_set(mi, "Favorite Applications");
@ -110,7 +110,7 @@ e_int_menus_main_new(void)
} }
E_Menu * E_Menu *
e_int_menus_apps_new(char *dir, int top) e_int_menus_apps_new(char *dir)
{ {
E_Menu *m; E_Menu *m;
E_App *a; E_App *a;
@ -119,11 +119,8 @@ e_int_menus_apps_new(char *dir, int top)
a = e_app_new(dir, 0); a = e_app_new(dir, 0);
e_object_data_set(E_OBJECT(m), a); e_object_data_set(E_OBJECT(m), a);
e_menu_pre_activate_callback_set(m, _e_int_menus_apps_start, NULL); e_menu_pre_activate_callback_set(m, _e_int_menus_apps_start, NULL);
if (top) e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_apps_del_hook);
{
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_free_attach_func_set(E_OBJECT(m), _e_int_menus_apps_free_hook);
}
return m; return m;
} }
@ -139,7 +136,7 @@ e_int_menus_desktops_new(void)
E_Menu * E_Menu *
e_int_menus_favorite_apps_new(int top) e_int_menus_favorite_apps_new(void)
{ {
E_Menu *m; E_Menu *m;
char buf[4096]; char buf[4096];
@ -149,7 +146,7 @@ e_int_menus_favorite_apps_new(int top)
if (homedir) if (homedir)
{ {
snprintf(buf, sizeof(buf), "%s/.e/e/applications/favorite", 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); free(homedir);
return m; return m;
} }
@ -168,17 +165,21 @@ e_int_menus_clients_new(void)
/* local subsystem functions */ /* local subsystem functions */
static void static void
_e_int_menus_main_end(void *data, E_Menu *m) _e_int_menus_main_del_hook(void *obj)
{ {
Main_Data *dat; Main_Data *dat;
E_Menu *m;
dat = data; 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->apps));
e_object_del(E_OBJECT(dat->modules)); e_object_del(E_OBJECT(dat->modules));
e_object_del(E_OBJECT(dat->desktops)); e_object_del(E_OBJECT(dat->desktops));
e_object_del(E_OBJECT(dat->clients)); e_object_del(E_OBJECT(dat->clients));
e_object_del(E_OBJECT(m));
free(dat); free(dat);
}
} }
static void static void
@ -235,7 +236,7 @@ _e_int_menus_apps_scan(E_Menu *m)
snprintf(buf, sizeof(buf), "%s/.directory.eet", a->path); snprintf(buf, sizeof(buf), "%s/.directory.eet", a->path);
e_menu_item_icon_edje_set(mi, buf, "icon"); 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++; app_count++;
} }
} }
@ -254,19 +255,19 @@ _e_int_menus_apps_start(void *data, E_Menu *m)
} }
static void 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; Evas_List *l;
m = obj;
for (l = m->items; l; l = l->next) for (l = m->items; l; l = l->next)
{ {
E_Menu_Item *mi; E_Menu_Item *mi;
mi = l->data; mi = l->data;
if (mi->submenu) if (mi->submenu) e_object_del(mi->submenu);
_e_int_menus_apps_end(NULL, mi->submenu);
} }
e_object_del(E_OBJECT(m));
} }
static void static void

View File

@ -4,7 +4,7 @@
EAPI E_Menu *e_int_menus_main_new(void); EAPI E_Menu *e_int_menus_main_new(void);
EAPI E_Menu *e_int_menus_desktops_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_clients_new(void);
EAPI E_Menu *e_int_menus_apps_new(char *dir, int top); EAPI E_Menu *e_int_menus_apps_new(char *dir);
EAPI E_Menu *e_int_menus_favorite_apps_new(int top); EAPI E_Menu *e_int_menus_favorite_apps_new(void);
#endif #endif

View File

@ -45,6 +45,7 @@ e_object_del(E_Object *obj)
{ {
E_OBJECT_CHECK(obj); E_OBJECT_CHECK(obj);
obj->deleted = 1; obj->deleted = 1;
if (obj->del_att_func) obj->del_att_func(obj);
if (obj->del_func) obj->del_func(obj); if (obj->del_func) obj->del_func(obj);
e_object_unref(obj); e_object_unref(obj);
} }
@ -67,7 +68,7 @@ void
e_object_free(E_Object *obj) e_object_free(E_Object *obj)
{ {
E_OBJECT_CHECK(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->magic = E_OBJECT_MAGIC_FREED;
obj->cleanup_func(obj); obj->cleanup_func(obj);
} }
@ -217,7 +218,14 @@ void
e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj)) e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj))
{ {
E_OBJECT_CHECK(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 #ifdef OBJECT_PARANOIA_CHECK

View File

@ -50,7 +50,8 @@ struct _E_Object
int references; int references;
E_Object_Cleanup_Func del_func; E_Object_Cleanup_Func del_func;
E_Object_Cleanup_Func cleanup_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; void *data;
unsigned char deleted : 1; unsigned char deleted : 1;
}; };
@ -67,5 +68,6 @@ EAPI int e_object_error (E_Object *obj);
EAPI void e_object_data_set (E_Object *obj, void *data); EAPI void e_object_data_set (E_Object *obj, void *data);
EAPI void *e_object_data_get (E_Object *obj); 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_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 #endif

View File

@ -8,6 +8,7 @@
*/ */
static void _e_zone_free(E_Zone *zone); 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_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_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); static void _e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info);
@ -206,6 +207,12 @@ _e_zone_free(E_Zone *zone)
free(zone); free(zone);
} }
static void
_e_zone_cb_menu_end(void *data, E_Menu *m)
{
e_object_del(E_OBJECT(m));
}
static void static void
_e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
{ {
@ -221,6 +228,7 @@ _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_i
E_Menu *m; E_Menu *m;
m = e_int_menus_main_new(); 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_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1,
E_MENU_POP_DIRECTION_DOWN); E_MENU_POP_DIRECTION_DOWN);
e_util_container_fake_mouse_up_all_later(zone->container); e_util_container_fake_mouse_up_all_later(zone->container);
@ -232,6 +240,7 @@ _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_i
m = e_int_menus_clients_new(); m = e_int_menus_clients_new();
/* FIXME: this is a bit of a hack... setting m->con - bad hack */ /* FIXME: this is a bit of a hack... setting m->con - bad hack */
m->zone = zone; 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_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1,
E_MENU_POP_DIRECTION_DOWN); E_MENU_POP_DIRECTION_DOWN);
e_util_container_fake_mouse_up_all_later(zone->container); e_util_container_fake_mouse_up_all_later(zone->container);
@ -240,7 +249,8 @@ _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_i
{ {
E_Menu *m; 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_activate_mouse(m, zone, ev->output.x, ev->output.y, 1, 1,
E_MENU_POP_DIRECTION_DOWN); E_MENU_POP_DIRECTION_DOWN);
e_util_container_fake_mouse_up_all_later(zone->container); e_util_container_fake_mouse_up_all_later(zone->container);