From 029df828eaed87c7f8b2804502bf41e7c3dcf5b6 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 15 Oct 2020 19:50:50 +0100 Subject: [PATCH] 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 +++++++++++++++++-- .../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