remove client callback from luncher icon when necessary

==20443== Invalid read of size 8
==20443==    at 0x28CED526: _bar_exec_new_show (bar.c:980)
==20443==    by 0x819D78D: _eo_evas_object_cb (evas_callbacks.c:184)
==20443==    by 0xDFB6FED: _event_callback_call (eo_base_class.c:1496)
==20443==    by 0xDFB7373: _efl_object_event_callback_legacy_call (eo_base_class.c:1569)
==20443==    by 0xDFB743A: efl_event_callback_legacy_call (eo_base_class.c:1572)
==20443==    by 0x81DC562: _efl_canvas_object_efl_object_event_callback_legacy_call (evas_object_main.c:993)
==20443==    by 0xDFB743A: efl_event_callback_legacy_call (eo_base_class.c:1572)
==20443==    by 0x819E1F8: evas_object_event_callback_call (evas_callbacks.c:404)
==20443==    by 0x81E6B23: evas_object_inform_call_show (evas_object_inform.c:13)
==20443==    by 0x81DECA2: _show (evas_object_main.c:1689)
==20443==    by 0x81DF0E7: _efl_canvas_object_efl_gfx_visible_set (evas_object_main.c:1810)
==20443==    by 0xDD670B9: efl_gfx_visible_set (efl_gfx.eo.c:21)
==20443==    by 0x81DEA93: evas_object_show (evas_object_main.c:1639)
==20443==    by 0x483706: _e_comp_intercept_show_helper (e_comp_object.c:1754)
==20443==    by 0x483761: _e_comp_intercept_show (e_comp_object.c:1768)
==20443==    by 0x81E7536: evas_object_intercept_call_show (evas_object_intercept.c:71)
==20443==    by 0x81E7ED2: _evas_object_intercept_call_internal (evas_object_intercept.c:103)
==20443==    by 0x81E88B0: _evas_object_intercept_call_evas (evas_object_intercept.c:236)
==20443==    by 0x81DF0CA: _efl_canvas_object_efl_gfx_visible_set (evas_object_main.c:1807)
==20443==    by 0xDD670B9: efl_gfx_visible_set (efl_gfx.eo.c:21)
==20443==    by 0x81DEA93: evas_object_show (evas_object_main.c:1639)
==20443==    by 0x4A6793: _e_desk_show_begin (e_desk.c:821)
==20443==    by 0x4A4E39: e_desk_show (e_desk.c:312)
==20443==    by 0x537C2E: _e_int_menus_clients_item_cb (e_int_menus.c:1624)
==20443==    by 0x548D3F: _e_menu_active_call (e_menu.c:2056)
==20443==    by 0x54ABFB: _e_menu_cb_mouse_up (e_menu.c:2789)
==20443==    by 0xC636B66: _ecore_call_handler_cb (ecore_private.h:325)
==20443==    by 0xC637B3F: _ecore_event_call (ecore_events.c:518)
==20443==    by 0xC641158: _ecore_main_loop_iterate_internal (ecore_main.c:2397)
==20443==    by 0xC63EC7E: ecore_main_loop_begin (ecore_main.c:1299)
==20443==    by 0x43DE81: main (e_main.c:1081)
==20443==  Address 0x20 is not stack'd, malloc'd or (recently) free'd
This commit is contained in:
Mike Blumenkrantz 2017-06-09 20:18:20 -04:00
parent b76972b162
commit b98854b17b
2 changed files with 32 additions and 2 deletions

View File

@ -3,6 +3,7 @@ static Eina_List *handlers;
static Eina_Bool _bar_icon_preview_show(void *data);
static Eina_Bool _bar_icon_preview_hide(void *data);
static void _bar_icon_del(Instance *inst, Icon *ic);
static void _bar_exec_new_show(void *data, Evas *e, Evas_Object *obj, void *event_data);
static float
_bar_size_calc(Instance *inst)
@ -187,6 +188,11 @@ _bar_icon_match(Instance *inst, E_Client *ec)
{
ic2->execs = eina_list_remove(ic2->execs, ec->exe_inst);
ic2->clients = eina_list_remove(ic2->clients, ec);
if (ic2->client_cbs)
{
ic2->client_cbs = eina_list_remove(ic2->client_cbs, ec);
evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic2);
}
if (!eina_list_count(ic2->execs) && !eina_list_count(ic2->clients))
{
eina_hash_del(inst->icons_clients_hash, ec, ic2);
@ -236,6 +242,8 @@ _bar_instance_watch(void *data, E_Exec_Instance *ex, E_Exec_Watch_Type type)
static void
_bar_icon_del(Instance *inst, Icon *ic)
{
E_Client *ec;
inst->icons = eina_list_remove(inst->icons, ic);
if (ic->preview)
_bar_icon_preview_hide(ic);
@ -250,6 +258,8 @@ _bar_icon_del(Instance *inst, Icon *ic)
efreet_desktop_unref(ic->desktop);
eina_list_free(ic->execs);
eina_list_free(ic->clients);
EINA_LIST_FREE(ic->client_cbs, ec)
evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic);
eina_stringshare_del(ic->icon);
eina_stringshare_del(ic->key);
if (ic->exec)
@ -987,6 +997,7 @@ _bar_exec_new_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *even
ic->mouse_in_timer = ecore_timer_loop_add(0.3, _bar_icon_preview_show, ic);
}
}
ic->client_cbs = eina_list_remove(ic->client_cbs, ec);
evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic);
}
@ -1299,6 +1310,11 @@ _bar_cb_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Clie
if (ic->starting) elm_layout_signal_emit(ic->o_layout, "e,state,started", "e");
ic->starting = EINA_FALSE;
ic->clients = eina_list_remove(ic->clients, ev->ec);
if (ic->client_cbs)
{
ic->client_cbs = eina_list_remove(ic->client_cbs, ev->ec);
evas_object_event_callback_del_full(ev->ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic);
}
if (ev->ec->exe_inst)
ic->execs = eina_list_remove(ic->execs, ev->ec->exe_inst);
if (!eina_list_count(ic->execs) && !eina_list_count(ic->clients))
@ -1351,6 +1367,11 @@ _bar_cb_exec_del(void *data EINA_UNUSED, int type EINA_UNUSED, E_Exec_Instance *
ic->starting = EINA_FALSE;
ic->execs = eina_list_remove(ic->execs, ex);
ic->clients = eina_list_remove(ic->clients, ec);
if (ic->client_cbs)
{
ic->client_cbs = eina_list_remove(ic->client_cbs, ec);
evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic);
}
if (!eina_list_count(ic->execs) && !eina_list_count(ic->clients))
{
snprintf(ori, sizeof(ori), "e,state,off,%s", _bar_location_get(inst));
@ -1465,6 +1486,11 @@ _bar_cb_exec_client_prop(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_C
ic->execs = eina_list_remove(ic->execs, ev->ec->exe_inst);
else
ic->clients = eina_list_remove(ic->clients, ev->ec);
if (ic->client_cbs)
{
ic->client_cbs = eina_list_remove(ic->client_cbs, ev->ec);
evas_object_event_callback_del_full(ev->ec->frame, EVAS_CALLBACK_SHOW, _bar_exec_new_show, ic);
}
if (!eina_list_count(ic->execs) && !eina_list_count(ic->clients))
{
if (ic->preview)
@ -1539,8 +1565,11 @@ _bar_cb_exec_new(void *data EINA_UNUSED, int type, E_Exec_Instance *ex)
if (evas_object_visible_get(ec->frame))
_bar_exec_new_show(ic, NULL, ec->frame, NULL);
else
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW,
_bar_exec_new_show, ic);
{
ic->client_cbs = eina_list_append(ic->client_cbs, ec);
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW,
_bar_exec_new_show, ic);
}
}
else
{

View File

@ -84,6 +84,7 @@ struct _Icon
Efreet_Desktop *desktop;
Eina_List *execs;
Eina_List *clients;
Eina_List *client_cbs;
Ecore_Timer *mouse_in_timer;
Ecore_Timer *mouse_out_timer;
Ecore_Timer *drag_timer;