e_desk_area: Hotfix for client stack issue on e_client_del 60/316460/1
authorJunseok Kim <juns.kim@samsung.com>
Tue, 20 Aug 2024 07:55:49 +0000 (16:55 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 22 Aug 2024 02:06:17 +0000 (11:06 +0900)
There was a bug that access to the client list on callback of E_CLIENT_HOOK_DEL,
but the client was already deleted on e_client destroy signal.
This caused a mismatch between the e_client stack and the evas_object stack.

For fix this issue, remove the client from client list when the client is being free.

NOTE: It's hotfix, Therefore, we need to check the process of deleting e_desk_area again,
and modify the code to fit to legacy behavior.

Change-Id: Ib714c801660f48df9a0631202f796f55ef10432b

src/bin/core/e_client.c
src/bin/core/e_desk_area.c
src/bin/core/e_intern.h
src/include/e_client.h
src/include/e_desk_area.h

index 2ab9263..ee9054c 100644 (file)
@@ -220,6 +220,9 @@ static Eina_Inlist *_e_client_hooks[] =
    [E_CLIENT_HOOK_TRANSFORM_CHANGE] = NULL,
    [E_CLIENT_HOOK_ACTIVATE_DONE] = NULL,
    [E_CLIENT_HOOK_EVAL_VISIBILITY_END] = NULL,
+#ifdef CLIENT_DEL_STACK_ISSUE
+   [E_CLIENT_HOOK_FREE] = NULL,
+#endif // CLIENT_DEL_STACK_ISSUE
 };
 
 static Eina_Inlist *_e_client_intercept_hooks[] =
@@ -1105,6 +1108,11 @@ _e_client_free(E_Client *ec)
    e_client_netwm_name_set(ec, NULL);
 
    e_view_destroy(e_view_client_view_get(PRI(ec)->view_client));
+
+#ifdef CLIENT_DEL_STACK_ISSUE
+   _e_client_hook_call(E_CLIENT_HOOK_FREE, ec);
+#endif // CLIENT_DEL_STACK_ISSUE
+
    E_FREE_FUNC(ec->frame, evas_object_del);
 
    E_OBJECT(ec)->references--;
index 4448015..6c7b747 100644 (file)
@@ -557,6 +557,23 @@ _e_desk_area_cb_hook_subsurface_create(void *data, E_Client *ec)
      }
 }
 
+#ifdef CLIENT_DEL_STACK_ISSUE
+static void
+_desk_area_cb_client_free(void *data, E_Client *ec)
+{
+   E_Desk_Area *eda = data;
+   E_Comp_Object *cw;
+
+   ELOGF("EDA", "HOOK CLIENT FREE. desk_area:%p", ec, eda);
+
+   cw = evas_object_smart_data_get(ec->frame);
+   if (cw)
+     _e_comp_object_layers_remove(eda, cw);
+   else
+     ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+}
+#endif //CLIENT_DEL_STACK_ISSUE
+
 EINTERN int
 e_desk_area_init(void)
 {
@@ -604,6 +621,9 @@ static void
 _e_desk_area_free(E_Desk_Area *eda)
 {
    E_FREE_FUNC(eda->hook_subsurf_create, e_comp_wl_hook_del);
+#ifdef CLIENT_DEL_STACK_ISSUE
+   E_FREE_FUNC(eda->hook_client_free, e_comp_wl_hook_del);
+#endif // CLIENT_DEL_STACK_ISSUE
 
    _e_desk_area_private_finish(eda);
    free(eda);
@@ -709,7 +729,10 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
 {
    E_Desk_Area *eda = eda_client->eda;
    E_Client *ec = eda_client->ec;
+#ifdef CLIENT_DEL_STACK_ISSUE
+#else
    E_Comp_Object *cw;
+#endif // CLIENT_DEL_STACK_ISSUE
 
    if (!e_desk_area_has_ec(eda, ec)) return;
 
@@ -717,11 +740,14 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    e_util_transform_del(ec->desk_area.transform);
    ec->desk_area.transform = NULL;
 
+#ifdef CLIENT_DEL_STACK_ISSUE
+#else
    cw = evas_object_smart_data_get(ec->frame);
    if (cw)
      _e_comp_object_layers_remove(eda, cw);
    else
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
+#endif // CLIENT_DEL_STACK_ISSUE
 
    _e_desk_area_smart_client_del(eda->smart_obj, ec);
    _e_desk_area_client_data_del(eda, ec);
@@ -2550,6 +2576,11 @@ e_desk_area_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Area_La
                                                  _e_desk_area_cb_hook_subsurface_create,
                                                  NULL);
 
+#ifdef CLIENT_DEL_STACK_ISSUE
+   eda->hook_client_free = e_client_hook_add(E_CLIENT_HOOK_FREE,
+                                             _desk_area_cb_client_free,
+                                             eda);
+#endif // CLIENT_DEL_STACK_ISSUE
    return eda;
 }
 
index 0f65154..2879366 100644 (file)
@@ -21,6 +21,7 @@
 #include <Eina.h>
 
 #define CHECKING_PRIMARY_ZPOS
+#define CLIENT_DEL_STACK_ISSUE
 
 #ifdef ENABLE_TTRACE
 #undef TRACE_DS_BEGIN
index 5b26a8f..369a173 100644 (file)
@@ -291,6 +291,9 @@ typedef enum _E_Client_Hook_Point
    E_CLIENT_HOOK_TRANSFORM_CHANGE,
    E_CLIENT_HOOK_ACTIVATE_DONE,
    E_CLIENT_HOOK_EVAL_VISIBILITY_END,
+#ifdef CLIENT_DEL_STACK_ISSUE
+   E_CLIENT_HOOK_FREE,
+#endif // CLIENT_DEL_STACK_ISSUE
    E_CLIENT_HOOK_LAST,
 } E_Client_Hook_Point;
 
index 449e5f0..4ee5242 100644 (file)
@@ -67,6 +67,9 @@ struct _E_Desk_Area
    Eina_List           *fullscreen_clients;
 
    E_Comp_Wl_Hook      *hook_subsurf_create;
+#ifdef CLIENT_DEL_STACK_ISSUE
+   E_Client_Hook       *hook_client_free;
+#endif // CLIENT_DEL_STACK_ISSUE
 };
 
 struct _E_Event_Desk_Area