e_policy_desk: Add client hash to store private client 94/325194/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 28 May 2025 07:15:16 +0000 (16:15 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 4 Jun 2025 06:55:56 +0000 (15:55 +0900)
Change-Id: Ie4143eb4c06bb1369996fe41445bd41e8a33343e

src/bin/windowmgr/e_policy_desk.c

index 938abb0ad430564ea961d2d037bea21c9779921d..07231cb7082818746c6b55f79f01a540af2fa183 100644 (file)
@@ -45,6 +45,7 @@ struct _E_Policy_Desk
 
    E_Desk          *desk;
    E_Zone          *zone;
+   Eina_Hash       *clients_hash;
 
    struct wl_listener policy_desk_area_client_add;
    struct wl_listener desk_free;
@@ -868,6 +869,7 @@ _e_policy_desk_cb_desk_client_add(struct wl_listener *listener, void *data)
    EINA_SAFETY_ON_NULL_RETURN(desk_client);
 
    desk_client->desk = desk;
+   eina_hash_add(pd->clients_hash, &ec, desk_client);
 
    if (!e_desk_desk_area_find_by_ec(desk, ec))
      {
@@ -915,6 +917,7 @@ _e_policy_desk_cb_desk_client_remove(struct wl_listener *listener, void *data)
    if (eda) e_desk_area_ec_remove(eda, ec);
 
    _e_policy_desk_private_client_del(desk_client);
+   eina_hash_del_by_key(pd->clients_hash, &ec);
 }
 
 static void
@@ -1846,16 +1849,19 @@ static void
 _e_policy_desk_cb_client_destroy(struct wl_listener *listener, void *data)
 {
    E_Policy_Desk_Private_Client *desk_client;
+   E_Policy_Desk *pd;
    E_Desk *desk;
    E_Client *ec;
 
    desk_client = wl_container_of(listener, desk_client, client_destroy);
    desk = desk_client->desk;
    ec = desk_client->ec;
+   pd = e_policy_desk_get(desk_client->desk);
 
    ELOGF("POL_DESK", "CLIENT DESTROY. desk:%p", ec, desk);
 
    _e_policy_desk_private_client_del(desk_client);
+   if (pd) eina_hash_del_by_key(pd->clients_hash, &ec);
 }
 
 static void
@@ -1980,6 +1986,7 @@ e_policy_desk_new(E_Desk *desk)
 
    pd->desk = desk;
    pd->zone = desk->zone;
+   pd->clients_hash = eina_hash_pointer_new(NULL);
 
    eina_hash_add(hash_policy_desks, &desk, pd);
    wl_signal_init(&pd->events.client_add);
@@ -2069,7 +2076,9 @@ EINTERN void
 e_policy_desk_del(E_Policy_Desk *pd)
 {
    E_Policy_Client *pc;
+   E_Policy_Desk_Private_Client *desk_client;
    E_Client *ec;
+   Eina_Iterator *it;
 
    /* remove clients */
    E_DESK_CLIENT_FOREACH(pd->desk, ec)
@@ -2083,6 +2092,17 @@ e_policy_desk_del(E_Policy_Desk *pd)
 
    e_policy_container_view_tree_shutdown(e_policy_container_get(pd));
 
+   if (pd->clients_hash)
+     {
+        it = eina_hash_iterator_data_new(pd->clients_hash);
+        EINA_ITERATOR_FOREACH(it, desk_client)
+          {
+             if (!desk_client) continue;
+             _e_policy_desk_private_client_del(desk_client);
+          }
+        eina_hash_free(pd->clients_hash);
+     }
+
    eina_hash_del_by_key(hash_policy_desks, &pd->desk);
 }