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
devs/bu5hm4n/mixerfun
Carsten Haitzler 3 years ago
parent 13a5e58e79
commit 029df828ea
  1. 29
      src/modules/systray/e_mod_notifier_host.c
  2. 1
      src/modules/systray/e_mod_notifier_host_private.h

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

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

Loading…
Cancel
Save