e_policy_zone: Add client hash and store private clients 23/320623/1
authorJunseok Kim <juns.kim@samsung.com>
Mon, 24 Feb 2025 08:39:10 +0000 (17:39 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Mar 2025 05:00:11 +0000 (14:00 +0900)
Change-Id: I10faad7a979db7562992b4ef74714a6be95c0ae4

src/bin/windowmgr/e_policy_zone.c

index f068d86dc9f589c73c4d05f61b613ff500f3309f..50edf68ce7342ce82611ac870d46a3f62f004376 100644 (file)
@@ -27,6 +27,7 @@ typedef struct _E_Policy_Zone_Private_Client E_Policy_Zone_Private_Client;
 struct _E_Policy_Zone
 {
    E_Zone *zone;
+   Eina_Hash *clients_hash;
 
    struct wl_listener client_add;
    struct wl_listener has_ec;
@@ -1272,6 +1273,7 @@ _e_policy_zone_cb_client_add(struct wl_listener *listener, void *data)
    zone_client = _e_policy_zone_private_client_new(policy_zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(zone_client);
 
+   eina_hash_add(policy_zone->clients_hash, &ec, zone_client);
    _e_policy_zone_client_set(zone, ec);
    _e_policy_zone_client_data_set(zone, ec);
 
@@ -1386,6 +1388,8 @@ _e_policy_zone_private_client_del(E_Policy_Zone_Private_Client *zone_client)
    wl_list_remove(&zone_client->client_eval_post_new_client.link);
    wl_list_remove(&zone_client->client_destroy.link);
 
+   eina_hash_del_by_key(policy_zone->clients_hash, &ec);
+
    E_FREE(zone_client);
 }
 
@@ -2003,6 +2007,8 @@ e_policy_zone_new(E_Zone *zone)
    policy_zone->zone = zone;
    e_object_ref(E_OBJECT(zone));
 
+   policy_zone->clients_hash = eina_hash_pointer_new(NULL);
+
    // events
    wl_signal_init(&policy_zone->events.client_add);
    wl_signal_init(&policy_zone->events.client_remove);
@@ -2141,6 +2147,9 @@ e_policy_zone_new(E_Zone *zone)
 EINTERN void
 e_policy_zone_del(E_Policy_Zone *policy_zone)
 {
+   E_Policy_Zone_Private_Client *zone_client;
+   Eina_Iterator *it;
+
    EINA_SAFETY_ON_NULL_RETURN(policy_zone);
 
    e_object_unref(E_OBJECT(policy_zone->zone));
@@ -2158,6 +2167,17 @@ e_policy_zone_del(E_Policy_Zone *policy_zone)
    wl_list_remove(&policy_zone->zone_client_top_get.link);
    wl_list_remove(&policy_zone->zone_destroy.link);
 
+   if (policy_zone->clients_hash)
+     {
+        it = eina_hash_iterator_data_new(policy_zone->clients_hash);
+        EINA_ITERATOR_FOREACH(it, zone_client)
+          {
+             if (!zone_client) continue;
+             _e_policy_zone_private_client_del(zone_client);
+          }
+        eina_hash_free(policy_zone->clients_hash);
+     }
+
    E_FREE(policy_zone);
 
    return;