forked from enlightenment/enlightenment
ibar - fix shutdown if ibar client menu is up
valgrind pointed out a referencing issue with the ibar client menu on hover and if e is shut down while this is up. it ends up referencing an already deleted ibar icon, so delete the menu objects that reference the icon if icon is deleted. @fix
This commit is contained in:
parent
551657e02a
commit
3195b760ee
|
@ -69,6 +69,7 @@ struct _IBar_Icon
|
||||||
IBar *ibar;
|
IBar *ibar;
|
||||||
Evas_Object *o_holder, *o_icon;
|
Evas_Object *o_holder, *o_icon;
|
||||||
Evas_Object *o_holder2, *o_icon2;
|
Evas_Object *o_holder2, *o_icon2;
|
||||||
|
Eina_List *client_objs;
|
||||||
Efreet_Desktop *app;
|
Efreet_Desktop *app;
|
||||||
Ecore_Timer *reset_timer;
|
Ecore_Timer *reset_timer;
|
||||||
Ecore_Timer *timer;
|
Ecore_Timer *timer;
|
||||||
|
@ -875,7 +876,9 @@ static void
|
||||||
_ibar_icon_free(IBar_Icon *ic)
|
_ibar_icon_free(IBar_Icon *ic)
|
||||||
{
|
{
|
||||||
E_Exec_Instance *inst;
|
E_Exec_Instance *inst;
|
||||||
|
Evas_Object *o;
|
||||||
|
|
||||||
|
EINA_LIST_FREE(ic->client_objs, o) evas_object_del(o);
|
||||||
if (ic->ibar->menu_icon == ic) ic->ibar->menu_icon = NULL;
|
if (ic->ibar->menu_icon == ic) ic->ibar->menu_icon = NULL;
|
||||||
if (ic->ibar->ic_drop_before == ic) ic->ibar->ic_drop_before = NULL;
|
if (ic->ibar->ic_drop_before == ic) ic->ibar->ic_drop_before = NULL;
|
||||||
if (ic->menu) e_object_data_set(E_OBJECT(ic->menu), NULL);
|
if (ic->menu) e_object_data_set(E_OBJECT(ic->menu), NULL);
|
||||||
|
@ -1214,9 +1217,11 @@ _ibar_cb_icon_menu_img_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, vo
|
||||||
{
|
{
|
||||||
int w, h;
|
int w, h;
|
||||||
E_Client *ec;
|
E_Client *ec;
|
||||||
IBar_Icon *ic = evas_object_data_del(data, "ibar_icon");
|
IBar_Icon *ic;
|
||||||
|
|
||||||
|
ic = evas_object_data_del(data, "ibar_icon");
|
||||||
if (!ic) return; //menu is closing
|
if (!ic) return; //menu is closing
|
||||||
|
if (ic) ic->client_objs = eina_list_remove(ic->client_objs, obj);
|
||||||
if (!ic->menu) return; //who knows
|
if (!ic->menu) return; //who knows
|
||||||
edje_object_part_box_remove(ic->menu->o_bg, "e.box", data);
|
edje_object_part_box_remove(ic->menu->o_bg, "e.box", data);
|
||||||
ec = evas_object_data_get(obj, "E_Client");
|
ec = evas_object_data_get(obj, "E_Client");
|
||||||
|
@ -1279,6 +1284,8 @@ _ibar_icon_menu_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
|
||||||
static void
|
static void
|
||||||
_ibar_cb_icon_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
_ibar_cb_icon_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
IBar_Icon *ic = evas_object_data_del(obj, "ibar_icon");
|
||||||
|
if (ic) ic->client_objs = eina_list_remove(ic->client_objs, obj);
|
||||||
e_comp_object_signal_callback_del_full(data, "e,state,*focused", "e", _ibar_cb_icon_menu_focus_change, obj);
|
e_comp_object_signal_callback_del_full(data, "e,state,*focused", "e", _ibar_cb_icon_menu_focus_change, obj);
|
||||||
evas_object_smart_callback_del_full(data, "desk_change", _ibar_cb_icon_menu_desk_change, obj);
|
evas_object_smart_callback_del_full(data, "desk_change", _ibar_cb_icon_menu_desk_change, obj);
|
||||||
}
|
}
|
||||||
|
@ -1293,10 +1300,12 @@ _ibar_icon_menu_client_add(IBar_Icon *ic, E_Client *ec)
|
||||||
if (ec->netwm.state.skip_taskbar) return EINA_FALSE;
|
if (ec->netwm.state.skip_taskbar) return EINA_FALSE;
|
||||||
o = ic->menu->o_bg;
|
o = ic->menu->o_bg;
|
||||||
it = edje_object_add(e_comp->evas);
|
it = edje_object_add(e_comp->evas);
|
||||||
|
ic->client_objs = eina_list_append(ic->client_objs, it);
|
||||||
e_comp_object_util_del_list_append(ic->menu->comp_object, it);
|
e_comp_object_util_del_list_append(ic->menu->comp_object, it);
|
||||||
e_theme_edje_object_set(it, "base/theme/modules/ibar",
|
e_theme_edje_object_set(it, "base/theme/modules/ibar",
|
||||||
"e/modules/ibar/menu/item");
|
"e/modules/ibar/menu/item");
|
||||||
img = e_comp_object_util_mirror_add(ec->frame);
|
img = e_comp_object_util_mirror_add(ec->frame);
|
||||||
|
ic->client_objs = eina_list_append(ic->client_objs, img);
|
||||||
e_comp_object_signal_callback_add(ec->frame, "e,state,*focused", "e", _ibar_cb_icon_menu_focus_change, it);
|
e_comp_object_signal_callback_add(ec->frame, "e,state,*focused", "e", _ibar_cb_icon_menu_focus_change, it);
|
||||||
evas_object_smart_callback_add(ec->frame, "desk_change", _ibar_cb_icon_menu_desk_change, it);
|
evas_object_smart_callback_add(ec->frame, "desk_change", _ibar_cb_icon_menu_desk_change, it);
|
||||||
evas_object_event_callback_add(it, EVAS_CALLBACK_DEL,
|
evas_object_event_callback_add(it, EVAS_CALLBACK_DEL,
|
||||||
|
|
Loading…
Reference in New Issue