E_Desk *desk;
E_Zone *zone;
+ Eina_Hash *clients_hash;
struct wl_listener policy_desk_area_client_add;
struct wl_listener desk_free;
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))
{
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
_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
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);
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)
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);
}