e_desk_area: remove freed ec on ec inlist when the comp object already removed 35/323935/2
authorJunseok Kim <juns.kim@samsung.com>
Fri, 9 May 2025 08:51:32 +0000 (17:51 +0900)
committerJunseok Kim <juns.kim@samsung.com>
Fri, 9 May 2025 09:27:56 +0000 (18:27 +0900)
Change-Id: Idee6b7e7ceb47e01308040e628cd39dbe579a205

src/bin/core/e_desk_area.c

index 1a9054d70c1afbb4d67a5e31988c1c0ddd7c341f..13e04f0687c7954e17de06aa7c653399636647d9 100644 (file)
@@ -261,6 +261,31 @@ _e_comp_object_layers_remove(E_Desk_Area *eda, E_Comp_Object *cw)
    e_comp_ec_list_unlock();
 }
 
+static void
+_e_comp_object_layers_ec_remove(E_Desk_Area *eda, E_Client *ec)
+{
+   unsigned int layer;
+
+   if (!ec) return;
+
+   e_comp_ec_list_lock();
+
+   for (layer = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); layer <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); layer++)
+     {
+        if (eda->layers[layer].clients)
+          {
+             if (eina_inlist_find(eda->layers[layer].clients, EINA_INLIST_GET(ec)))
+               {
+                  eda->layers[layer].clients = eina_inlist_remove(eda->layers[layer].clients, EINA_INLIST_GET(ec));
+                  eda->layers[layer].clients_count--;
+                  _e_comp_object_layers_update(layer, E_COMP_INPUT_INLIST_REMOVE, ec, NULL);
+               }
+          }
+     }
+
+   e_comp_ec_list_unlock();
+}
+
 static Eina_Bool
 _e_comp_object_is_pending(E_Client *ec)
 {
@@ -560,7 +585,10 @@ _desk_area_cb_client_free(void *data, E_Client *ec)
    if (cw)
      _e_comp_object_layers_remove(eda, cw);
    else
-     ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+     {
+        ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+        _e_comp_object_layers_ec_remove(eda, ec);
+     }
 }
 #endif //CLIENT_DEL_STACK_ISSUE
 
@@ -736,7 +764,10 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    if (cw)
      _e_comp_object_layers_remove(eda, cw);
    else
-     ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+     {
+        ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+        _e_comp_object_layers_ec_remove(eda, ec);
+     }
 #endif // CLIENT_DEL_STACK_ISSUE
 
    _e_desk_area_smart_client_del(eda->smart_obj, ec);