diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 125de1742..d1b2e5a40 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -491,6 +491,7 @@ e_border_zone_set(E_Border *bd, E_Zone *zone) ev = calloc(1, sizeof(E_Event_Border_Zone_Set)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_zone_set_event"); ev->zone = zone; e_object_ref(E_OBJECT(zone)); ecore_event_add(E_EVENT_BORDER_ZONE_SET, ev, _e_border_event_border_zone_set_free, NULL); @@ -516,6 +517,7 @@ e_border_desk_set(E_Border *bd, E_Desk *desk) ev = calloc(1, sizeof(E_Event_Border_Desk_Set)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_desk_set_event"); ev->desk = desk; e_object_ref(E_OBJECT(desk)); ecore_event_add(E_EVENT_BORDER_DESK_SET, ev, _e_border_event_border_desk_set_free, NULL); @@ -544,6 +546,7 @@ e_border_show(E_Border *bd) ev = calloc(1, sizeof(E_Event_Border_Show)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_show_event"); ecore_event_add(E_EVENT_BORDER_SHOW, ev, _e_border_event_border_show_free, NULL); } @@ -595,6 +598,7 @@ e_border_hide(E_Border *bd, int manage) ev = calloc(1, sizeof(E_Event_Border_Hide)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_hide_event"); ecore_event_add(E_EVENT_BORDER_HIDE, ev, _e_border_event_border_hide_free, NULL); } } @@ -643,6 +647,7 @@ e_border_move(E_Border *bd, int x, int y) ev = calloc(1, sizeof(E_Event_Border_Move)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event"); ecore_event_add(E_EVENT_BORDER_MOVE, ev, _e_border_event_border_move_free, NULL); } @@ -688,6 +693,7 @@ e_border_resize(E_Border *bd, int w, int h) ev = calloc(1, sizeof(E_Event_Border_Resize)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event"); ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL); } @@ -742,11 +748,13 @@ e_border_move_resize(E_Border *bd, int x, int y, int w, int h) mev = calloc(1, sizeof(E_Event_Border_Move)); mev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event"); ecore_event_add(E_EVENT_BORDER_MOVE, mev, _e_border_event_border_move_free, NULL); rev = calloc(1, sizeof(E_Event_Border_Resize)); rev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event"); ecore_event_add(E_EVENT_BORDER_RESIZE, rev, _e_border_event_border_resize_free, NULL); } @@ -764,6 +772,7 @@ e_border_raise(E_Border *bd) ev = calloc(1, sizeof(E_Event_Border_Raise)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event"); ev->above = NULL; ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL); } @@ -783,6 +792,7 @@ e_border_lower(E_Border *bd) ev = calloc(1, sizeof(E_Event_Border_Lower)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event"); ev->below = NULL; ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); } @@ -802,8 +812,10 @@ e_border_stack_above(E_Border *bd, E_Border *above) ev = calloc(1, sizeof(E_Event_Border_Raise)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event"); ev->above = above; e_object_ref(E_OBJECT(above)); + e_object_breadcrumb_add(E_OBJECT(above), "border_raise_event.above"); ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL); } } @@ -821,8 +833,10 @@ e_border_stack_below(E_Border *bd, E_Border *below) ev = calloc(1, sizeof(E_Event_Border_Lower)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event"); ev->below = below; e_object_ref(E_OBJECT(below)); + e_object_breadcrumb_add(E_OBJECT(below), "border_lower_event.below"); ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); } } @@ -994,6 +1008,7 @@ e_border_shade(E_Border *bd, E_Direction dir) /* The resize is added in the animator when animation complete */ /* For non-animated, we add it immediately with the new size */ e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event"); ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL); } @@ -1082,6 +1097,7 @@ e_border_unshade(E_Border *bd, E_Direction dir) /* The resize is added in the animator when animation complete */ /* For non-animated, we add it immediately with the new size */ e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event"); ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL); } @@ -1354,6 +1370,7 @@ e_border_iconify(E_Border *bd) ev = E_NEW(E_Event_Border_Iconify, 1); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_iconify_event"); ecore_event_add(E_EVENT_BORDER_ICONIFY, ev, _e_border_event_border_iconify_free, NULL); } @@ -1382,6 +1399,7 @@ e_border_uniconify(E_Border *bd) ev = E_NEW(E_Event_Border_Uniconify, 1); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_uniconify_event"); ecore_event_add(E_EVENT_BORDER_UNICONIFY, ev, _e_border_event_border_uniconify_free, NULL); } @@ -1401,6 +1419,7 @@ e_border_stick(E_Border *bd) ev = E_NEW(E_Event_Border_Stick, 1); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_stick_event"); ecore_event_add(E_EVENT_BORDER_STICK, ev, _e_border_event_border_stick_free, NULL); } @@ -1421,6 +1440,7 @@ e_border_unstick(E_Border *bd) ev = E_NEW(E_Event_Border_Unstick, 1); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_unstick_event"); ecore_event_add(E_EVENT_BORDER_UNSTICK, ev, _e_border_event_border_unstick_free, NULL); } @@ -1947,6 +1967,7 @@ _e_border_del_dangling_ref_check(void *data) printf("%p, %i, \"%s\" [\"%s\" \"%s\"]\n", bd, e_object_ref_get(E_OBJECT(bd)), bd->client.icccm.title, bd->client.icccm.name, bd->client.icccm.class); + e_object_breadcrumb_debug(E_OBJECT(bd)); printf("---\n"); return 1; } @@ -1973,6 +1994,7 @@ _e_border_del(E_Border *bd) /* FIXME Don't ref this during shutdown. And the event is pointless * during shutdown.. */ e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_remove_event"); ecore_event_add(E_EVENT_BORDER_REMOVE, ev, _e_border_event_border_remove_free, NULL); } @@ -3761,6 +3783,7 @@ _e_border_eval(E_Border *bd) ev = calloc(1, sizeof(E_Event_Border_Icon_Change)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_icon_change_event"); ecore_event_add(E_EVENT_BORDER_ICON_CHANGE, ev, _e_border_event_border_icon_change_free, NULL); } @@ -4088,6 +4111,7 @@ _e_border_eval(E_Border *bd) ev = calloc(1, sizeof(E_Event_Border_Add)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_add_event"); ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL); /* Recreate state */ @@ -4636,6 +4660,7 @@ _e_border_shade_animator(void *data) ev = calloc(1, sizeof(E_Event_Border_Resize)); ev->border = bd; e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event"); ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL); return 0; } @@ -5001,6 +5026,7 @@ _e_border_event_border_resize_free(void *data, void *ev) E_Event_Border_Resize *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_resize_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5011,6 +5037,7 @@ _e_border_event_border_move_free(void *data, void *ev) E_Event_Border_Move *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_move_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5021,6 +5048,7 @@ _e_border_event_border_add_free(void *data, void *ev) E_Event_Border_Add *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_add_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5031,6 +5059,7 @@ _e_border_event_border_remove_free(void *data, void *ev) E_Event_Border_Remove *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_remove_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5041,6 +5070,7 @@ _e_border_event_border_show_free(void *data, void *ev) E_Event_Border_Show *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_show_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5051,6 +5081,7 @@ _e_border_event_border_hide_free(void *data, void *ev) E_Event_Border_Hide *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_hide_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5061,6 +5092,7 @@ _e_border_event_border_iconify_free(void *data, void *ev) E_Event_Border_Iconify *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_iconify_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5071,6 +5103,7 @@ _e_border_event_border_uniconify_free(void *data, void *ev) E_Event_Border_Uniconify *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_uniconify_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5081,6 +5114,7 @@ _e_border_event_border_stick_free(void *data, void *ev) E_Event_Border_Stick *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_stick_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5091,6 +5125,7 @@ _e_border_event_border_unstick_free(void *data, void *ev) E_Event_Border_Unstick *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_unstick_event"); e_object_unref(E_OBJECT(e->border)); free(e); } @@ -5101,6 +5136,7 @@ _e_border_event_border_zone_set_free(void *data, void *ev) E_Event_Border_Zone_Set *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_zone_set_event"); e_object_unref(E_OBJECT(e->border)); e_object_unref(E_OBJECT(e->zone)); free(e); @@ -5112,6 +5148,7 @@ _e_border_event_border_desk_set_free(void *data, void *ev) E_Event_Border_Desk_Set *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_desk_set_event"); e_object_unref(E_OBJECT(e->border)); e_object_unref(E_OBJECT(e->desk)); free(e); @@ -5123,8 +5160,13 @@ _e_border_event_border_raise_free(void *data, void *ev) E_Event_Border_Raise *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_raise_event"); e_object_unref(E_OBJECT(e->border)); - if (e->above) e_object_unref(E_OBJECT(e->above)); + if (e->above) + { + e_object_breadcrumb_del(E_OBJECT(e->above), "border_raise_event.above"); + e_object_unref(E_OBJECT(e->above)); + } free(e); } @@ -5134,8 +5176,13 @@ _e_border_event_border_lower_free(void *data, void *ev) E_Event_Border_Lower *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_lower_event"); e_object_unref(E_OBJECT(e->border)); - if (e->below) e_object_unref(E_OBJECT(e->below)); + if (e->below) + { + e_object_breadcrumb_del(E_OBJECT(e->below), "border_lower_event.below"); + e_object_unref(E_OBJECT(e->below)); + } free(e); } @@ -5145,6 +5192,7 @@ _e_border_event_border_icon_change_free(void *data, void *ev) E_Event_Border_Icon_Change *e; e = ev; + e_object_breadcrumb_del(E_OBJECT(e->border), "border_icon_change_event"); e_object_unref(E_OBJECT(e->border)); free(e); } diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index 62b50d386..7ff12f0aa 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -556,6 +556,7 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m) e_menu_item_label_set(mi, _("No name!!")); /* ref the border as we implicitly unref it in the callback */ e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "clients_menu"); e_menu_item_callback_set(mi, _e_int_menus_clients_item_cb, bd); if (!bd->iconic) e_menu_item_toggle_set(mi, 1); a = e_app_window_name_class_find(bd->client.icccm.name, @@ -589,6 +590,7 @@ _e_int_menus_clients_free_hook(void *obj) bd = borders->data; borders = evas_list_remove_list(borders, borders); + e_object_breadcrumb_del(E_OBJECT(bd), "clients_menu"); e_object_unref(E_OBJECT(bd)); } } @@ -797,6 +799,7 @@ _e_int_menus_lost_clients_pre_cb(void *data, E_Menu *m) e_menu_item_label_set(mi, _("No name!!")); /* ref the border as we implicitly unref it in the callback */ e_object_ref(E_OBJECT(bd)); + e_object_breadcrumb_add(E_OBJECT(bd), "lost_clients_menu"); e_menu_item_callback_set(mi, _e_int_menus_lost_clients_item_cb, bd); a = e_app_window_name_class_find(bd->client.icccm.name, bd->client.icccm.class); @@ -820,6 +823,7 @@ _e_int_menus_lost_clients_free_hook(void *obj) bd = borders->data; borders = evas_list_remove_list(borders, borders); + e_object_breadcrumb_del(E_OBJECT(bd), "lost_clients_menu"); e_object_unref(E_OBJECT(bd)); } } diff --git a/src/bin/e_object.c b/src/bin/e_object.c index e3ab6d4c3..1947544f2 100644 --- a/src/bin/e_object.c +++ b/src/bin/e_object.c @@ -252,6 +252,39 @@ e_object_del_attach_func_set(E_Object *obj, void (*func) (void *obj)) obj->del_att_func = func; } +void +e_object_breadcrumb_add(E_Object *obj, char *crumb) +{ + E_OBJECT_CHECK(obj); + obj->crumbs = evas_list_append(obj->crumbs, strdup(crumb)); +} + +void +e_object_breadcrumb_del(E_Object *obj, char *crumb) +{ + Evas_List *l; + + E_OBJECT_CHECK(obj); + for (l = obj->crumbs; l; l = l->next) + { + if (!strcmp(crumb, l->data)) + { + free(l->data); + obj->crumbs = evas_list_remove_list(obj->crumbs, l); + } + } +} + +void +e_object_breadcrumb_debug(E_Object *obj) +{ + Evas_List *l; + + E_OBJECT_CHECK(obj); + for (l = obj->crumbs; l; l = l->next) + printf("CRUMB: %s\n", l->data); +} + #ifdef OBJECT_PARANOIA_CHECK /* local subsystem functions */ static void diff --git a/src/bin/e_object.h b/src/bin/e_object.h index 2758008f7..77f9eb81b 100644 --- a/src/bin/e_object.h +++ b/src/bin/e_object.h @@ -70,6 +70,7 @@ struct _E_Object void (*del_att_func) (void *obj); void *data; unsigned char deleted : 1; + Evas_List *crumbs; }; EAPI void *e_object_alloc (int size, int type, E_Object_Cleanup_Func cleanup_func); @@ -87,5 +88,9 @@ 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)); +EAPI void e_object_breadcrumb_add (E_Object *obj, char *crumb); +EAPI void e_object_breadcrumb_del (E_Object *obj, char *crumb); +EAPI void e_object_breadcrumb_debug (E_Object *obj); + #endif #endif diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 41c85ca74..a72381330 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -606,6 +606,8 @@ _pager_window_new(Pager_Desk *pd, E_Border *border) pw->border = border; e_object_ref(E_OBJECT(border)); + e_object_breadcrumb_add(E_OBJECT(border), "pager_module"); + visible = !border->iconic; pw->desk = pd; @@ -636,6 +638,7 @@ _pager_window_free(Pager_Win *pw) { if (pw->window_object) evas_object_del(pw->window_object); if (pw->icon_object) evas_object_del(pw->icon_object); + e_object_breadcrumb_del(E_OBJECT(pw->border), "pager_module"); e_object_unref(E_OBJECT(pw->border)); free(pw); }