e_policy_wl: refactoring for handling tzsh, tzsh_service, tzsh_client 49/262649/3
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 17 Aug 2021 06:29:19 +0000 (15:29 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Tue, 17 Aug 2021 07:36:54 +0000 (16:36 +0900)
We found a memory leak for the E_QP_Client in some case.
If a window created two more tzsh_quickpanel clients and destroyed them,
then e COULD NOT CALL the first quickpanel client's e_qp_client_del function.
This was because e handled ec information by tzsh only.

To resolve this,
We add two lists - tzsh_service, tzsh_client - in the E_Policy_Wl_Tzsh.
Also we move some information(E_Client and E_Pixmap) to E_Policy_Wl_Tzsh_Srv and
E_Policy_Wl_Tzsh_Client from E_Policy_Wl_Tzsh.
And Each E_Policy_Wl_Tzsh_Srv and E_Policy_Wl_Tzsh_Client handle its ec itself.

Change-Id: Ie79ab1ccbbf934400d0b478a4162d21d6fba0f88

src/bin/e_policy_wl.c

index 54e41fc2119596b0140ee6f8aadd77fc5ca7a2ba..98c41a12b6fbfdcc96c71fe83351a1074bc8ed25 100644 (file)
@@ -67,9 +67,8 @@ typedef struct _E_Policy_Wl_Tz_Dpy_Pol
 typedef struct _E_Policy_Wl_Tzsh
 {
    struct wl_resource *res_tzsh; /* tizen_ws_shell_interface */
-   Tzsh_Type           type;
-   E_Pixmap           *cp;
-   E_Client           *ec;
+   Eina_List *service_list;
+   Eina_List *client_list;
 } E_Policy_Wl_Tzsh;
 
 typedef struct _E_Policy_Wl_Tzsh_Srv
@@ -78,6 +77,8 @@ typedef struct _E_Policy_Wl_Tzsh_Srv
    struct wl_resource *res_tzsh_srv;
    Tzsh_Srv_Role       role;
    const char         *name;
+   E_Pixmap *ep;
+   E_Client *ec;
 } E_Policy_Wl_Tzsh_Srv;
 
 typedef struct _E_Policy_Wl_Tzsh_Client
@@ -87,6 +88,8 @@ typedef struct _E_Policy_Wl_Tzsh_Client
    Eina_Bool           qp_client;
    E_Quickpanel_Type   qp_type;
    Eina_Bool           swl_client;
+   E_Pixmap *ep;
+   E_Client *ec;
 } E_Policy_Wl_Tzsh_Client;
 
 typedef struct _E_Policy_Wl_Tzsh_Region
@@ -277,9 +280,9 @@ static const char *hint_names[] =
 static void                _e_policy_wl_surf_del(E_Policy_Wl_Surface *psurf);
 static void                _e_policy_wl_tzsh_srv_state_broadcast(E_Policy_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool reg);
 static Eina_Bool           _e_policy_wl_e_client_is_valid(E_Client *ec);
-static E_Policy_Wl_Tzsh_Srv    *_e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *res_tzsh_srv, const char *name);
+static E_Policy_Wl_Tzsh_Srv    *_e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *res_tzsh_srv, const char *name, E_Pixmap *ep, E_Client *ec);
 static void                _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv);
-static E_Policy_Wl_Tzsh_Client *_e_policy_wl_tzsh_client_add(E_Policy_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client);
+static E_Policy_Wl_Tzsh_Client *_e_policy_wl_tzsh_client_add(E_Policy_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client, E_Pixmap *ep, E_Client *ec);
 static void                _e_policy_wl_tzsh_client_del(E_Policy_Wl_Tzsh_Client *tzsh_client);
 static void                _e_policy_wl_background_state_set(E_Policy_Wl_Surface *psurf, Eina_Bool state);
 
@@ -477,6 +480,40 @@ _e_policy_wl_surf_is_valid(E_Policy_Wl_Surface *psurf)
 // --------------------------------------------------------
 // E_Policy_Wl_Tzsh
 // --------------------------------------------------------
+#ifdef TZSH_DEBUG
+static void
+_print_tzsh_service_info(void)
+{
+   E_Policy_Wl_Tzsh_Srv *tzsh_srv = NULL;
+   Eina_List *l = NULL;
+   int i = 0;
+
+   ELOGF("TZSH", "================ TZSH SERVICE LIST ================", NULL);
+   EINA_LIST_FOREACH(polwl->tzsh_srvs, l, tzsh_srv)
+     {
+        ELOGF("TZSH", "[%d] tzsh_service(%p). tzsh:%p, role:%d, name:%s", tzsh_srv->ec, i, tzsh_srv, tzsh_srv->tzsh, tzsh_srv->role, tzsh_srv->name);
+        i++;
+     }
+   ELOGF("TZSH", "---------------------------------------------------", NULL);
+}
+
+static void
+_print_tzsh_client_info(void)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client = NULL;
+   Eina_List *l = NULL;
+   int i = 0;
+
+   ELOGF("TZSH", "================ TZSH CLIENT LIST  ================", NULL);
+   EINA_LIST_FOREACH(polwl->tzsh_clients, l, tzsh_client)
+     {
+        ELOGF("TZSH", "[%d] tzsh_client(%p). tzsh:%p", tzsh_client->ec, i, tzsh_client, tzsh_client->tzsh);
+        i++;
+     }
+   ELOGF("TZSH", "---------------------------------------------------", NULL);
+}
+#endif
+
 static E_Policy_Wl_Tzsh *
 _e_policy_wl_tzsh_add(struct wl_resource *res_tzsh)
 {
@@ -486,10 +523,14 @@ _e_policy_wl_tzsh_add(struct wl_resource *res_tzsh)
    EINA_SAFETY_ON_NULL_RETURN_VAL(tzsh, NULL);
 
    tzsh->res_tzsh = res_tzsh;
-   tzsh->type = TZSH_TYPE_UNKNOWN;
 
    polwl->tzshs = eina_list_append(polwl->tzshs, tzsh);
 
+#ifdef TZSH_DEBUG
+   _print_tzsh_service_info();
+   _print_tzsh_client_info();
+#endif
+
    return tzsh;
 }
 
@@ -502,37 +543,42 @@ _e_policy_wl_tzsh_del(E_Policy_Wl_Tzsh *tzsh)
 
    polwl->tzshs = eina_list_remove(polwl->tzshs, tzsh);
 
-   if (tzsh->type == TZSH_TYPE_SRV)
+   if (tzsh->service_list)
      {
-        EINA_LIST_FOREACH_SAFE(polwl->tzsh_srvs, l, ll, tzsh_srv)
+        EINA_LIST_FREE(tzsh->service_list, tzsh_srv)
           {
-             if (tzsh_srv->tzsh != tzsh) continue;
-             _e_policy_wl_tzsh_srv_del(tzsh_srv);
-             break;
+             EINA_LIST_FOREACH_SAFE(polwl->tzsh_srvs, l, ll, tzsh_srv)
+               {
+                  if (tzsh_srv->tzsh != tzsh) continue;
+                  _e_policy_wl_tzsh_srv_del(tzsh_srv);
+                  break;
+               }
           }
+        tzsh->service_list = NULL;
      }
-   else
+
+   if (tzsh->client_list)
      {
-        EINA_LIST_FOREACH_SAFE(polwl->tzsh_clients, l, ll, tzsh_client)
+        EINA_LIST_FREE(tzsh->client_list, tzsh_client)
           {
-             if (tzsh_client->tzsh != tzsh) continue;
-             _e_policy_wl_tzsh_client_del(tzsh_client);
-             break;
+             EINA_LIST_FOREACH_SAFE(polwl->tzsh_clients, l, ll, tzsh_client)
+               {
+                  if (tzsh_client->tzsh != tzsh) continue;
+                  _e_policy_wl_tzsh_client_del(tzsh_client);
+                  break;
+               }
           }
      }
 
+#ifdef TZSH_DEBUG
+   _print_tzsh_service_info();
+   _print_tzsh_client_info();
+#endif
+
    memset(tzsh, 0x0, sizeof(E_Policy_Wl_Tzsh));
    E_FREE(tzsh);
 }
 
-static void
-_e_policy_wl_tzsh_data_set(E_Policy_Wl_Tzsh *tzsh, Tzsh_Type type, E_Pixmap *cp, E_Client *ec)
-{
-   tzsh->type = type;
-   tzsh->cp = cp;
-   tzsh->ec = ec;
-}
-
 /* notify current registered services to the client */
 static void
 _e_policy_wl_tzsh_registered_srv_send(E_Policy_Wl_Tzsh *tzsh)
@@ -548,73 +594,12 @@ _e_policy_wl_tzsh_registered_srv_send(E_Policy_Wl_Tzsh *tzsh)
      }
 }
 
-static E_Policy_Wl_Tzsh *
-_e_policy_wl_tzsh_get_from_client(E_Client *ec)
-{
-   E_Policy_Wl_Tzsh *tzsh = NULL;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(polwl->tzshs, l, tzsh)
-     {
-        if (tzsh->cp == ec->pixmap)
-          {
-             if ((tzsh->ec) &&
-                 (tzsh->ec != ec))
-               {
-                  ELOGF("TZSH",
-                        "CRI ERR!!|tzsh_cp:%8p|tzsh_ec:%8p|tzsh:%8p",
-                        ec,
-                        tzsh->cp,
-                        tzsh->ec,
-                        tzsh);
-               }
-
-             return tzsh;
-          }
-     }
-
-   return NULL;
-}
-
-static void
-_e_policy_wl_tzsh_client_set(E_Client *ec)
-{
-   E_Policy_Wl_Tzsh *tzsh;
-
-   tzsh = _e_policy_wl_tzsh_get_from_client(ec);
-   if (!tzsh) return;
-
-   tzsh->ec = ec;
-}
-
-static void
-_e_policy_wl_tzsh_client_unset(E_Client *ec)
-{
-   E_Policy_Wl_Tzsh *tzsh;
-   E_Policy_Wl_Tzsh_Srv *tzsh_srv;
-
-   tzsh = _e_policy_wl_tzsh_get_from_client(ec);
-   if (!tzsh) return;
-
-   if (tzsh->type == TZSH_TYPE_SRV)
-     {
-        tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_SOFTKEY];
-        if (tzsh_srv)
-          {
-             if (tzsh_srv->tzsh == tzsh)
-               {
-                  e_service_softkey_client_unset(ec);
-                  tzsh->ec = NULL;
-               }
-          }
-     }
-}
 
 // --------------------------------------------------------
 // E_Policy_Wl_Tzsh_Srv
 // --------------------------------------------------------
 static E_Policy_Wl_Tzsh_Srv *
-_e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *res_tzsh_srv, const char *name)
+_e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *res_tzsh_srv, const char *name, E_Pixmap *ep, E_Client *ec)
 {
    E_Policy_Wl_Tzsh_Srv *tzsh_srv;
 
@@ -625,10 +610,17 @@ _e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_
    tzsh_srv->res_tzsh_srv = res_tzsh_srv;
    tzsh_srv->role = role;
    tzsh_srv->name = eina_stringshare_add(name);
+   tzsh_srv->ep = ep;
+   tzsh_srv->ec = ec;
+   tzsh_srv->tzsh->service_list = eina_list_append(tzsh_srv->tzsh->service_list, tzsh_srv);
 
    polwl->srvs[role] = tzsh_srv;
    polwl->tzsh_srvs = eina_list_append(polwl->tzsh_srvs, tzsh_srv);
 
+#ifdef TZSH_DEBUG
+   _print_tzsh_service_info();
+#endif
+
    _e_policy_wl_tzsh_srv_state_broadcast(tzsh_srv, EINA_TRUE);
 
    return tzsh_srv;
@@ -639,6 +631,13 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
 {
    polwl->tzsh_srvs = eina_list_remove(polwl->tzsh_srvs, tzsh_srv);
 
+#ifdef TZSH_DEBUG
+   _print_tzsh_service_info();
+#endif
+
+   if (tzsh_srv->tzsh)
+     tzsh_srv->tzsh->service_list = eina_list_remove(tzsh_srv->tzsh->service_list, tzsh_srv);
+
    if (polwl->srvs[tzsh_srv->role] == tzsh_srv)
      polwl->srvs[tzsh_srv->role] = NULL;
 
@@ -650,11 +649,11 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
    if (tzsh_srv->role == TZSH_SRV_ROLE_INDICATOR)
      {
         E_Client *ec;
-        ec = tzsh_srv->tzsh->ec;
+        ec = tzsh_srv->ec;
 
         if (ec && ec->internal)
           {
-             e_pixmap_win_id_del(tzsh_srv->tzsh->cp);
+             e_pixmap_win_id_del(tzsh_srv->ep);
              e_object_del(E_OBJECT(ec));
           }
 
@@ -664,7 +663,7 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
      {
         E_Client *softkey_ec = NULL;
 
-        softkey_ec = tzsh_srv->tzsh->ec;
+        softkey_ec = tzsh_srv->ec;
         if (softkey_ec)
           {
              e_service_softkey_client_unset(softkey_ec);
@@ -674,7 +673,7 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
      {
         E_Client *magnifier_ec = NULL;
 
-        magnifier_ec = tzsh_srv->tzsh->ec;
+        magnifier_ec = tzsh_srv->ec;
         if (magnifier_ec)
           {
              e_magnifier_owner_unset(magnifier_ec);
@@ -685,7 +684,7 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
      {
         E_Client *launcher_ec = NULL;
 
-        launcher_ec = tzsh_srv->tzsh->ec;
+        launcher_ec = tzsh_srv->ec;
         if (launcher_ec)
           {
              e_service_launcher_client_unset(launcher_ec);
@@ -742,7 +741,7 @@ _e_policy_wl_tzsh_srv_state_broadcast(E_Policy_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool
 // E_Policy_Wl_Tzsh_Client
 // --------------------------------------------------------
 static E_Policy_Wl_Tzsh_Client *
-_e_policy_wl_tzsh_client_add(E_Policy_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client)
+_e_policy_wl_tzsh_client_add(E_Policy_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client, E_Pixmap *ep, E_Client *ec)
 {
    E_Policy_Wl_Tzsh_Client *tzsh_client;
 
@@ -751,11 +750,16 @@ _e_policy_wl_tzsh_client_add(E_Policy_Wl_Tzsh *tzsh, struct wl_resource *res_tzs
 
    tzsh_client->tzsh = tzsh;
    tzsh_client->res_tzsh_client = res_tzsh_client;
-
-   /* TODO: add tzsh_client to list or hash */
+   tzsh_client->ep = ep;
+   tzsh_client->ec = ec;
+   tzsh_client->tzsh->client_list = eina_list_append(tzsh_client->tzsh->client_list, tzsh_client);
 
    polwl->tzsh_clients = eina_list_append(polwl->tzsh_clients, tzsh_client);
 
+#ifdef TZSH_DEBUG
+   _print_tzsh_client_info();
+#endif
+
    return tzsh_client;
 }
 
@@ -764,19 +768,24 @@ _e_policy_wl_tzsh_client_del(E_Policy_Wl_Tzsh_Client *tzsh_client)
 {
    if (!tzsh_client) return;
 
+   if (tzsh_client->tzsh)
+     tzsh_client->tzsh->service_list = eina_list_remove(tzsh_client->tzsh->service_list, tzsh_client);
+
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
    polwl->tzsh_clients = eina_list_remove(polwl->tzsh_clients, tzsh_client);
+#ifdef TZSH_DEBUG
+   _print_tzsh_client_info();
+#endif
 
-   if ((tzsh_client->tzsh) &&
-       (tzsh_client->tzsh->ec))
+   if (tzsh_client->ec)
      {
         if (tzsh_client->qp_client)
-          e_qp_client_del(tzsh_client->tzsh->ec,
+          e_qp_client_del(tzsh_client->ec,
                           tzsh_client->qp_type);
         if (tzsh_client->swl_client)
-          e_service_launcher_release_shared_widget_launch(tzsh_client->tzsh->ec);
+          e_service_launcher_release_shared_widget_launch(tzsh_client->ec);
      }
 
    if (tzsh_client->res_tzsh_client)
@@ -3520,9 +3529,9 @@ _tzsh_srv_iface_cb_region_set(struct wl_client *client, struct wl_resource *res_
        (tzsh_srv->role == TZSH_SRV_ROLE_QUICKPANEL_APPS_MENU))
      {
         EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
-        EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+        EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->ec);
 
-        e_service_quickpanel_region_set(tzsh_srv->tzsh->ec,
+        e_service_quickpanel_region_set(tzsh_srv->ec,
                                         type,
                                         angle,
                                         tzsh_reg->tiler);
@@ -3534,9 +3543,9 @@ _tzsh_srv_iface_cb_region_set(struct wl_client *client, struct wl_resource *res_
         if (e_config->use_softkey_service)
           {
              EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
-             EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+             EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->ec);
 
-             e_service_softkey_handler_region_set(tzsh_srv->tzsh->ec, angle, tzsh_reg->tiler);
+             e_service_softkey_handler_region_set(tzsh_srv->ec, angle, tzsh_reg->tiler);
           }
      }
 }
@@ -3600,7 +3609,7 @@ _tzsh_srv_qp_cb_msg(struct wl_client *client EINA_UNUSED, struct wl_resource *re
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
 
-#define EC  tzsh_srv->tzsh->ec
+#define EC  tzsh_srv->ec
    EINA_SAFETY_ON_NULL_RETURN(EC);
 
    switch (msg)
@@ -3628,7 +3637,7 @@ _tzsh_srv_qp_cb_effect_type_set(struct wl_client *client EINA_UNUSED, struct wl_
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
 
-#define EC  tzsh_srv->tzsh->ec
+#define EC  tzsh_srv->ec
    EINA_SAFETY_ON_NULL_RETURN(EC);
    e_service_quickpanel_effect_type_set(EC, type);
 #undef EC
@@ -3644,7 +3653,7 @@ _tzsh_srv_qp_cb_scroll_lock_set(struct wl_client *client EINA_UNUSED, struct wl_
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
 
-#define EC  tzsh_srv->tzsh->ec
+#define EC  tzsh_srv->ec
    EINA_SAFETY_ON_NULL_RETURN(EC);
    e_service_quickpanel_scroll_lock_set(EC, lock);
 #undef EC
@@ -3703,7 +3712,7 @@ _tzsh_srv_softkey_cb_msg_send(struct wl_client *client EINA_UNUSED, struct wl_re
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
 
-   softkey_ec = tzsh_srv->tzsh->ec;
+   softkey_ec = tzsh_srv->ec;
    EINA_SAFETY_ON_NULL_RETURN(softkey_ec);
 
    softkey_service = e_service_softkey_get(softkey_ec->zone);
@@ -3751,10 +3760,11 @@ _tzsh_srv_iface_cb_softkey_get(struct wl_client *client, struct wl_resource *res
 
    ELOGF("TZSH", "[SOFTKEY SERVICE] resource created. res:%p, res_tzsh_srv:%p, id:%d", NULL, res, res_tzsh_srv, id);
 
-   if (tzsh_srv->tzsh && tzsh_srv->tzsh->ec)
+   if (tzsh_srv->tzsh)
      {
-        E_Client *softkey_ec = tzsh_srv->tzsh->ec;
-        softkey_service = e_service_softkey_get(softkey_ec->zone);
+        E_Client *softkey_ec = tzsh_srv->ec;
+        if (softkey_ec)
+          softkey_service = e_service_softkey_get(softkey_ec->zone);
         ELOGF("TZSH", "[SOFTKEY SERVICE] resource set. res:%p, softkey_service:%p, softkey_ec:%p", NULL, res, softkey_service, softkey_ec);
         if (softkey_service)
           {
@@ -3782,11 +3792,11 @@ _tzsh_srv_magnifier_cb_zoom_geometry_set(struct wl_client *client EINA_UNUSED, s
 
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->ec);
 
-   ELOGF("TZSH", "[MAGNIFIER] Set Geometry. angle:%d, geo:%d,%d,%dx%d", tzsh_srv->tzsh->ec, angle, x, y, w, h);
+   ELOGF("TZSH", "[MAGNIFIER] Set Geometry. angle:%d, geo:%d,%d,%dx%d", tzsh_srv->ec, angle, x, y, w, h);
 
-   ec = tzsh_srv->tzsh->ec;
+   ec = tzsh_srv->ec;
    // angle: 0, 90, 180, 270
    e_magnifier_zoom_obj_geometry_set(ec, angle, x, y, w, h);
 }
@@ -3801,11 +3811,11 @@ _tzsh_srv_magnifier_cb_ratio_set(struct wl_client *client EINA_UNUSED, struct wl
 
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->ec);
 
-   ELOGF("TZSH", "[MAGNIFIER] Set Ratio. ratio:%d", tzsh_srv->tzsh->ec, ratio);
+   ELOGF("TZSH", "[MAGNIFIER] Set Ratio. ratio:%d", tzsh_srv->ec, ratio);
 
-   ec = tzsh_srv->tzsh->ec;
+   ec = tzsh_srv->ec;
    // ratio : 100 ~ 200 (each 10)
    e_magnifier_zoom_obj_ratio_set(ec, ratio);
 }
@@ -3820,11 +3830,11 @@ _tzsh_srv_magnifier_cb_enable_set(struct wl_client *client EINA_UNUSED, struct w
 
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->ec);
 
-   ELOGF("TZSH", "[MAGNIFIER] Set Enable. enable:%d", tzsh_srv->tzsh->ec, enable);
+   ELOGF("TZSH", "[MAGNIFIER] Set Enable. enable:%d", tzsh_srv->ec, enable);
 
-   ec = tzsh_srv->tzsh->ec;
+   ec = tzsh_srv->ec;
 
    if (enable)
      e_magnifier_show(ec);
@@ -4034,7 +4044,7 @@ _tzsh_srv_cbhm_cb_msg(struct wl_client *client EINA_UNUSED, struct wl_resource *
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
 
-#define EC  tzsh_srv->tzsh->ec
+#define EC  tzsh_srv->ec
    EINA_SAFETY_ON_NULL_RETURN(EC);
 
    switch (msg)
@@ -4104,7 +4114,8 @@ _tzsh_srv_iface_cb_launcher_get(struct wl_client *client, struct wl_resource *re
         return;
      }
 
-   e_service_launcher_resource_set(tzsh_srv->tzsh->ec, res);
+   if (tzsh_srv->ec)
+     e_service_launcher_resource_set(tzsh_srv->ec, res);
 }
 
 static const struct tws_service_interface _tzsh_srv_iface =
@@ -4282,12 +4293,12 @@ _tzsh_iface_cb_srv_create(struct wl_client *client, struct wl_resource *res_tzsh
         return;
      }
 
-   _e_policy_wl_tzsh_data_set(tzsh, TZSH_TYPE_SRV, cp, ec);
-
    tzsh_srv = _e_policy_wl_tzsh_srv_add(tzsh,
                                         role,
                                         res_tzsh_srv,
-                                        name);
+                                        name,
+                                        cp,
+                                        ec);
    if (!tzsh_srv)
      {
         ERR("Could not create WS_Shell_Service");
@@ -4302,32 +4313,32 @@ _tzsh_iface_cb_srv_create(struct wl_client *client, struct wl_resource *res_tzsh
                                   _tzsh_cb_srv_destroy);
 
    if (role == TZSH_SRV_ROLE_QUICKPANEL_SYSTEM_DEFAULT)
-     e_service_quickpanel_client_add(tzsh->ec, E_SERVICE_QUICKPANEL_TYPE_SYSTEM_DEFAULT);
+     e_service_quickpanel_client_add(tzsh_srv->ec, E_SERVICE_QUICKPANEL_TYPE_SYSTEM_DEFAULT);
    else if (role == TZSH_SRV_ROLE_QUICKPANEL_CONTEXT_MENU)
-     e_service_quickpanel_client_add(tzsh->ec, E_SERVICE_QUICKPANEL_TYPE_CONTEXT_MENU);
+     e_service_quickpanel_client_add(tzsh_srv->ec, E_SERVICE_QUICKPANEL_TYPE_CONTEXT_MENU);
    else if (role == TZSH_SRV_ROLE_QUICKPANEL_APPS_MENU)
-     e_service_quickpanel_client_add(tzsh->ec, E_SERVICE_QUICKPANEL_TYPE_APPS_MENU);
+     e_service_quickpanel_client_add(tzsh_srv->ec, E_SERVICE_QUICKPANEL_TYPE_APPS_MENU);
    else if (role == TZSH_SRV_ROLE_VOLUME)
-     e_service_volume_client_set(tzsh->ec);
+     e_service_volume_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_LOCKSCREEN)
-     e_service_lockscreen_client_set(tzsh->ec);
+     e_service_lockscreen_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_SCREENSAVER_MNG)
-     e_service_scrsaver_client_set(tzsh->ec);
+     e_service_scrsaver_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_SCREENSAVER)
-     e_service_scrsaver_client_set(tzsh->ec);
+     e_service_scrsaver_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_INDICATOR)
-     e_mod_indicator_client_set(tzsh->ec);
+     e_mod_indicator_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_CBHM)
-     e_service_cbhm_client_set(tzsh->ec);
+     e_service_cbhm_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_SOFTKEY)
-     e_service_softkey_client_set(tzsh->ec);
+     e_service_softkey_client_set(tzsh_srv->ec);
    else if (role == TZSH_SRV_ROLE_MAGNIFIER)
      {
         e_magnifier_new();
-        e_magnifier_owner_set(tzsh->ec);
+        e_magnifier_owner_set(tzsh_srv->ec);
      }
    else if (role == TZSH_SRV_ROLE_LAUNCHER)
-     e_service_launcher_client_set(tzsh->ec);
+     e_service_launcher_client_set(tzsh_srv->ec);
 }
 
 // --------------------------------------------------------
@@ -4671,17 +4682,18 @@ e_tzsh_qp_state_visible_update(E_Client *ec, Eina_Bool vis, E_Quickpanel_Type ty
         /* check for type of qp */
         if (tzsh_client->qp_type != type) continue;
         if (!tzsh_client->tzsh) continue;
-        if (!tzsh_client->tzsh->ec) continue;
+        if (!tzsh_client->ec) continue;
 
-        if (tzsh_client->tzsh->cp == ec->pixmap)
+        if (tzsh_client->ep == ec->pixmap)
           {
-             if (tzsh_client->tzsh->ec != ec)
+             if (tzsh_client->ec != ec)
                {
                   ELOGF("TZSH",
-                        "CRI ERR!!|tzsh_cp:%8p|tzsh_ec:%8p|tzsh:%8p",
+                        "CRI ERR!!|tzsh_client_ep:%8p|tzsh_client_ec:%8p|tzsh_client:%8p|tzsh:%8p",
                         ec,
-                        tzsh_client->tzsh->cp,
-                        tzsh_client->tzsh->ec,
+                        tzsh_client->ep,
+                        tzsh_client->ec,
+                        tzsh_client,
                         tzsh_client->tzsh);
                   continue;
                }
@@ -4709,17 +4721,18 @@ e_tzsh_qp_state_scrollable_update(E_Client *ec, Eina_Bool scrollable, E_Quickpan
         /* check for type of qp */
         if (tzsh_client->qp_type != type) continue;
         if (!tzsh_client->tzsh) continue;
-        if (!tzsh_client->tzsh->ec) continue;
+        if (!tzsh_client->ec) continue;
 
-        if (tzsh_client->tzsh->cp == ec->pixmap)
+        if (tzsh_client->ep == ec->pixmap)
           {
-             if (tzsh_client->tzsh->ec != ec)
+             if (tzsh_client->ec != ec)
                {
                   ELOGF("TZSH",
-                        "CRI ERR!!|tzsh_cp:%8p|tzsh_ec:%8p|tzsh:%8p",
+                        "CRI ERR!!|tzsh_client_ep:%8p|tzsh_client_ec:%8p|tzsh_client:%8p|tzsh:%8p",
                         ec,
-                        tzsh_client->tzsh->cp,
-                        tzsh_client->tzsh->ec,
+                        tzsh_client->ep,
+                        tzsh_client->ec,
+                        tzsh_client,
                         tzsh_client->tzsh);
                   continue;
                }
@@ -4747,17 +4760,18 @@ e_tzsh_qp_state_orientation_update(E_Client *ec, int ridx, E_Quickpanel_Type typ
         /* check for type of qp */
         if (tzsh_client->qp_type != type) continue;
         if (!tzsh_client->tzsh) continue;
-        if (!tzsh_client->tzsh->ec) continue;
+        if (!tzsh_client->ec) continue;
 
-        if (tzsh_client->tzsh->cp == ec->pixmap)
+        if (tzsh_client->ep == ec->pixmap)
           {
-             if (tzsh_client->tzsh->ec != ec)
+             if (tzsh_client->ec != ec)
                {
                   ELOGF("TZSH",
-                        "CRI ERR!!|tzsh_cp:%8p|tzsh_ec:%8p|tzsh:%8p",
+                        "CRI ERR!!|tzsh_client_ep:%8p|tzsh_client_ec:%8p|tzsh_client:%8p|tzsh:%8p",
                         ec,
-                        tzsh_client->tzsh->cp,
-                        tzsh_client->tzsh->ec,
+                        tzsh_client->ep,
+                        tzsh_client->ec,
+                        tzsh_client,
                         tzsh_client->tzsh);
                   continue;
                }
@@ -4787,12 +4801,12 @@ _tzsh_qp_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4811,12 +4825,12 @@ _tzsh_qp_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4835,12 +4849,12 @@ _tzsh_qp_iface_cb_enable(struct wl_client *client EINA_UNUSED, struct wl_resourc
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4859,12 +4873,12 @@ _tzsh_qp_iface_cb_disable(struct wl_client *client EINA_UNUSED, struct wl_resour
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4884,12 +4898,12 @@ _tzsh_qp_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl_reso
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4928,13 +4942,13 @@ _tzsh_qp_iface_cb_type_set(struct wl_client *client EINA_UNUSED, struct wl_resou
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client has already specific quickpanel type */
    EINA_SAFETY_ON_FALSE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    tzsh_client->qp_type = (E_Quickpanel_Type)type;
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -4958,12 +4972,12 @@ _tzsh_qp_iface_cb_scrollable_state_set(struct wl_client *client EINA_UNUSED, str
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    /* unexpected case: this client doesn't have specific quickpanel type */
    EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
-   ec = tzsh_client->tzsh->ec;
+   ec = tzsh_client->ec;
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
@@ -4997,6 +5011,7 @@ _tzsh_cb_qp_destroy(struct wl_resource *res_tzsh_qp)
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
    tzsh_client->res_tzsh_client = NULL;
+
    _e_policy_wl_tzsh_client_del(tzsh_client);
 }
 
@@ -5053,9 +5068,7 @@ _tzsh_iface_cb_qp_get(struct wl_client *client, struct wl_resource *res_tzsh, ui
         return;
      }
 
-   _e_policy_wl_tzsh_data_set(tzsh, TZSH_TYPE_CLIENT, cp, ec);
-
-   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_qp);
+   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_qp, cp, ec);
    if (!tzsh_client)
      {
         ERR("Could not create tzsh_client");
@@ -5138,7 +5151,7 @@ _tzsh_softkey_iface_cb_support_check(struct wl_client *client EINA_UNUSED, struc
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -5165,7 +5178,7 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -5173,7 +5186,7 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
         if (softkey)
           {
              ELOGF("TZ_SOFTKEY", "SHOW softkey", NULL);
@@ -5184,7 +5197,7 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey_service)
      {
         E_Service_Softkey *softkey_service;
-        softkey_service = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
         if (softkey_service)
           {
              ELOGF("TZ_SOFTKEY", "Request to SHOW softkey service. (service:%p)", NULL, softkey_service);
@@ -5192,8 +5205,8 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
           }
         else
           {
-             ELOGF("TZ_SOFTKEY", "There is no softkey service. store show request", tzsh_client->tzsh->ec);
-             e_service_softkey_store_visible_request(tzsh_client->tzsh->ec, 1);
+             ELOGF("TZ_SOFTKEY", "There is no softkey service. store show request", tzsh_client->ec);
+             e_service_softkey_store_visible_request(tzsh_client->ec, 1);
           }
      }
 }
@@ -5211,7 +5224,7 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -5219,7 +5232,7 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
         if (softkey)
           {
              ELOGF("TZ_SOFTKEY", "HIDE softkey", NULL);
@@ -5230,7 +5243,7 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey_service)
      {
         E_Service_Softkey *softkey_service;
-        softkey_service = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
         if (softkey_service)
           {
              ELOGF("TZ_SOFTKEY", "Request to HIDE softkey service. (service:%p)", NULL, softkey_service);
@@ -5238,8 +5251,8 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
           }
         else
           {
-             ELOGF("TZ_SOFTKEY", "There is no softkey service. store hide request", tzsh_client->tzsh->ec);
-             e_service_softkey_store_visible_request(tzsh_client->tzsh->ec, 0);
+             ELOGF("TZ_SOFTKEY", "There is no softkey service. store hide request", tzsh_client->ec);
+             e_service_softkey_store_visible_request(tzsh_client->ec, 0);
           }
      }
 }
@@ -5259,7 +5272,7 @@ _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -5267,7 +5280,7 @@ _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
         if (!softkey) return;
 
         switch (type)
@@ -5301,7 +5314,7 @@ _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl
      {
         E_Service_Softkey *softkey_service;
 
-        softkey_service = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
         if (!softkey_service) return;
 
         switch (type)
@@ -5349,7 +5362,7 @@ _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
@@ -5357,7 +5370,7 @@ _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
         if (!softkey) return;
 
         switch (type)
@@ -5403,7 +5416,7 @@ _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl
    if (e_config->use_softkey_service)
      {
         E_Service_Softkey *softkey_service;
-        softkey_service = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
         if (!softkey_service) return;
 
         switch (type)
@@ -5535,9 +5548,7 @@ _tzsh_iface_cb_softkey_get(struct wl_client *client, struct wl_resource *res_tzs
         return;
      }
 
-   _e_policy_wl_tzsh_data_set(tzsh, TZSH_TYPE_CLIENT, cp, ec);
-
-   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_softkey);
+   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_softkey, cp, ec);
    if (!tzsh_client)
      {
         ERR("Could not create tzsh_client");
@@ -5569,8 +5580,8 @@ e_tzsh_shared_widget_launch_prepare_send(E_Client *callee_ec,
    EINA_LIST_FOREACH(polwl->tzsh_clients, l, tzsh_client)
      {
         if (!tzsh_client->tzsh) continue;
-        if (!tzsh_client->tzsh->ec) continue;
-        if (tzsh_client->tzsh->ec != callee_ec) continue;
+        if (!tzsh_client->ec) continue;
+        if (tzsh_client->ec != callee_ec) continue;
 
         tws_shared_widget_launch_send_prepare_shared_widget(tzsh_client->res_tzsh_client,
                                                             state,
@@ -5606,11 +5617,11 @@ _tzsh_swl_iface_cb_prepare_shared_widget_done(struct wl_client *client,
    tzsh_client = wl_resource_get_user_data(res_tzsh_swl);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh->ec);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
    EINA_SAFETY_ON_NULL_RETURN(eina_list_data_find(polwl->tzsh_clients, tzsh_client));
 
    // send prepare event to caller
-   e_service_launcher_prepare_send_with_shared_widget_info(tzsh_client->tzsh->ec,
+   e_service_launcher_prepare_send_with_shared_widget_info(tzsh_client->ec,
                                                            shared_widget_info,
                                                            state,
                                                            serial);
@@ -5692,9 +5703,7 @@ _tzsh_iface_cb_shared_widget_launch_get(struct wl_client *client,
         return;
      }
 
-   _e_policy_wl_tzsh_data_set(tzsh, TZSH_TYPE_CLIENT, cp, ec);
-
-   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_swl);
+   tzsh_client = _e_policy_wl_tzsh_client_add(tzsh, res_tzsh_swl, cp, ec);
    if (!tzsh_client)
      {
         ERR("Could not create tzsh_client");
@@ -7628,7 +7637,6 @@ e_policy_wl_client_add(E_Client *ec)
    if (!ec->pixmap) return;
 
    _e_policy_wl_surf_client_set(ec);
-   _e_policy_wl_tzsh_client_set(ec);
    _e_policy_wl_tzlaunch_effect_type_sync(ec);
 }
 
@@ -7639,7 +7647,6 @@ e_policy_wl_client_del(E_Client *ec)
    if (!ec->pixmap) return;
 
    e_policy_wl_pixmap_del(ec->pixmap);
-   _e_policy_wl_tzsh_client_unset(ec);
    _e_policy_wl_dpy_surf_del(ec);
    _e_policy_wl_tz_indicator_unset_client(ec);
    _e_policy_wl_tz_clipboard_unset_client(ec);