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

-- 


Reply via email to