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
This commit is contained in:
Carsten Haitzler 2020-10-15 19:50:50 +01:00
parent 13a5e58e79
commit 029df828ea
2 changed files with 28 additions and 2 deletions

View File

@ -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);

View File

@ -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