raster pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=029df828eaed87c7f8b2804502bf41e7c3dcf5b6
commit 029df828eaed87c7f8b2804502bf41e7c3dcf5b6 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Thu Oct 15 19:50:50 2020 +0100 fix systray gadget segv if menu up when tray item goes away the systray gadget code didnt deal with this case of menu up but item vanishes. quite bad. now the menu is freed and hiddtne/popped down when the item is removed. fixes T8842 @fix --- src/modules/systray/e_mod_notifier_host.c | 29 +++++++++++++++++++++-- src/modules/systray/e_mod_notifier_host_private.h | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/modules/systray/e_mod_notifier_host.c b/src/modules/systray/e_mod_notifier_host.c index 7d4b9fce4..f1b9c2a98 100644 --- a/src/modules/systray/e_mod_notifier_host.c +++ b/src/modules/systray/e_mod_notifier_host.c @@ -32,6 +32,13 @@ systray_notifier_item_free(Notifier_Item *item) } if (!ii) continue; + if (ii->menu) + { + e_menu_post_deactivate_callback_set(ii->menu, NULL, NULL); + e_object_del(E_OBJECT(ii->menu)); + ii->menu = NULL; + e_menu_hide_all(); + } host_inst->ii_list = eina_inlist_remove(host_inst->ii_list, EINA_INLIST_GET(ii)); evas_object_del(ii->icon); @@ -156,6 +163,7 @@ _menu_post_deactivate(void *data, E_Menu *m) E_Menu_Item *mi; E_Gadcon *gadcon = data; E_DBusMenu_Item *item; + Instance_Notifier_Host *host_inst; item = e_object_data_get(E_OBJECT(m)); if (item) @@ -175,6 +183,18 @@ _menu_post_deactivate(void *data, E_Menu *m) } if (mi->submenu) e_menu_deactivate(mi->submenu); } + EINA_INLIST_FOREACH(ctx->instances, host_inst) + { + Notifier_Item_Icon *ii; + EINA_INLIST_FOREACH(host_inst->ii_list, ii) + { + if (ii->menu == m) + { + ii->menu = NULL; + break; + } + } + } e_object_del(E_OBJECT(m)); } @@ -235,8 +255,13 @@ _clicked_item_cb(void *data, Evas *evas, Evas_Object *obj EINA_UNUSED, void *eve if (!ii->item->dbus_item) return; root_item = ii->item->dbus_item; EINA_SAFETY_ON_FALSE_RETURN(root_item->is_submenu); - - m = _item_submenu_new(root_item, NULL); + if (ii->menu) + { + e_menu_post_deactivate_callback_set(ii->menu, NULL, NULL); + e_object_del(E_OBJECT(ii->menu)); + ii->menu = NULL; + } + m = ii->menu = _item_submenu_new(root_item, NULL); e_gadcon_locked_set(gadcon, 1); e_menu_post_deactivate_callback_set(m, _menu_post_deactivate, gadcon); diff --git a/src/modules/systray/e_mod_notifier_host_private.h b/src/modules/systray/e_mod_notifier_host_private.h index 1a1904d52..63e31ccd7 100644 --- a/src/modules/systray/e_mod_notifier_host_private.h +++ b/src/modules/systray/e_mod_notifier_host_private.h @@ -24,6 +24,7 @@ typedef struct _Notifier_Data EINA_INLIST; Notifier_Item *item; Evas_Object *icon; + E_Menu *menu; } Notifier_Item_Icon; struct _Instance_Notifier_Host --