e_desk_area: use DESK_AREA_EC_DATA_KEY 48/304748/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 21 Dec 2023 01:39:57 +0000 (10:39 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 23 Jan 2024 09:19:22 +0000 (18:19 +0900)
ec has a information about where the ec belong to with this key.

Change-Id: I3852223886b5b3f49c4352c1cf54442c9513f6d8

src/bin/e_desk_area.c
src/bin/e_desk_area.h

index 0fa8950..a433868 100644 (file)
@@ -7,6 +7,8 @@
 typedef struct _E_Desk_Area_Private         E_Desk_Area_Private;
 typedef struct _E_Desk_Area_Private_Client  E_Desk_Area_Private_Client;
 
+#define DESK_AREA_EC_DATA_KEY  "E_Desk_Area_Client"
+
 #define PRI(eda) ((E_Desk_Area_Private *)e_object_data_get(E_OBJECT(eda)))
 
 #define API_ENTRY \
@@ -99,6 +101,32 @@ EVAS_SMART_SUBCLASS_NEW(E_DESK_AREA_SMART_OBJ_TYPE, _e_desk_area,
 
 #ifdef REFACTOR_DESK_AREA
 static void
+_e_desk_area_client_data_del(E_Desk_Area *eda, E_Client *ec)
+{
+   evas_object_data_del(ec->frame, DESK_AREA_EC_DATA_KEY);
+}
+
+static void
+_e_desk_area_client_data_set(E_Desk_Area *eda, E_Client *ec)
+{
+  E_Desk_Area *data;
+
+  data = evas_object_data_get(ec->frame, DESK_AREA_EC_DATA_KEY);
+  if (data)
+    {
+       if (data == eda)
+         {
+            ELOGF("EDA", "EC is already added to desk_area_id:%d", ec, eda->id);
+            return;
+         }
+
+       evas_object_data_del(ec->frame, DESK_AREA_EC_DATA_KEY);
+    }
+
+  evas_object_data_set(ec->frame, DESK_AREA_EC_DATA_KEY, eda);
+}
+
+static void
 _e_comp_object_layers_add(E_Desk_Area *eda, E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
 {
    g_rec_mutex_lock(&e_comp->ec_list_mutex);
@@ -693,8 +721,7 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
 
    _e_desk_area_smart_client_del(eda->smart_obj, ec);
-
-   eda->clients = eina_list_remove(eda->clients, eda_client);
+   _e_desk_area_client_data_del(eda, ec);
 
    // wl_list remove
    wl_list_remove(&eda_client->comp_object_stack_below.link);
@@ -1620,18 +1647,15 @@ _e_desk_area_client_layer_convert_from_layer(E_Layer layer)
 
 #ifdef REFACTOR_DESK_AREA
 static E_Desk_Area_Private_Client *
-_e_desk_area_ec_find_client(E_Desk_Area *eda, E_Client *ec)
+_e_desk_area_private_client_get(E_Client *ec)
 {
-   Eina_List *l;
    E_Desk_Area_Private_Client *eda_client;
+   struct wl_listener *listener;
 
-   EINA_LIST_FOREACH(eda->clients, l, eda_client)
-     {
-        if (eda_client->ec == ec)
-          return eda_client;
-     }
+   listener = e_client_destroy_listener_get(ec, _desk_area_cb_client_destroy);
+   if (!listener) return NULL;
 
-   return NULL;
+   return wl_container_of(listener, eda_client, client_destroy);
 }
 #endif
 
@@ -1652,7 +1676,11 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
    E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
 
-   if (_e_desk_area_ec_find_client(eda, ec)) return EINA_FALSE;
+   if (e_desk_area_has_ec(eda, ec))
+     {
+        ELOGF("EAD", "CLIENT Already added.", ec);
+        return EINA_TRUE;
+     }
 
    ELOGF("EAD", "CLIENT ADD", ec);
 
@@ -1688,8 +1716,7 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    eda_client->comp_object_stack_below.notify = _desk_area_cb_comp_object_stack_below;
    e_comp_object_stack_below_listener_add(ec->frame, &eda_client->comp_object_stack_below);
 
-   eda->clients = eina_list_append(eda->clients, eda_client);
-
+   _e_desk_area_client_data_set(eda, ec);
    _e_desk_area_smart_client_add(eda->smart_obj, ec);
 #else
    layer = e_client_desk_area_original_layer_get(ec);
@@ -1714,11 +1741,13 @@ e_desk_area_ec_remove(E_Desk_Area *eda, E_Client *ec)
    E_OBJECT_CHECK(ec);
    E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
 
-   eda_client = _e_desk_area_ec_find_client(eda, ec);
-   if (!eda_client) return;
+   if (!e_desk_area_has_ec(eda, ec)) return;
 
    ELOGF("EDA", "CLIENT REMOVE. desk_area:%p", ec, eda);
 
+   eda_client = _e_desk_area_private_client_get(ec);
+   EINA_SAFETY_ON_NULL_RETURN(eda_client);
+
    _e_desk_area_private_client_del(eda_client);
 #else
    E_Desk_Area_Client_Layer edgc_layer;
@@ -2458,4 +2487,17 @@ e_desk_area_bottom_ec_get(E_Desk_Area *eda)
 
    return NULL;
 }
+
+EINTERN Eina_Bool
+e_desk_area_has_ec(E_Desk_Area *eda, E_Client *ec)
+{
+   E_Desk_Area *data;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eda, EINA_FALSE);
+
+   data = evas_object_data_get(ec->frame, DESK_AREA_EC_DATA_KEY);
+   if (data == eda) return EINA_TRUE;
+
+   return EINA_FALSE;
+}
 #endif
index 42bf07c..7e0d04a 100644 (file)
@@ -64,7 +64,6 @@ struct _E_Desk_Area
    } layers[E_LAYER_COUNT];
 
    Evas_Object         *smart_obj;
-   Eina_List           *clients;
 //#endif
 
    E_Comp_Wl_Hook      *hook_subsurf_create;
@@ -125,6 +124,7 @@ E_API Eina_Bool       e_desk_area_transform_enable_get(E_Desk_Area *eda);
 //#ifdef REFACTOR_DESK_AREA
 EINTERN E_Client *       e_desk_area_top_ec_get(E_Desk_Area *eda);
 EINTERN E_Client *       e_desk_area_bottom_ec_get(E_Desk_Area *eda);
+EINTERN Eina_Bool e_desk_area_has_ec(E_Desk_Area *eda, E_Client *ec);
 //#endif
 
 // for debug