Revert "e_policy_wl: remove unused tzsh_tvsrv" 04/233004/2
authorJunSeok Kim <juns.kim@samsung.com>
Mon, 11 May 2020 08:02:18 +0000 (08:02 +0000)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 11 May 2020 08:20:52 +0000 (08:20 +0000)
This reverts commit 2a4fa3ad20028940fefe2c76aba0c6cd339c303e.

Reason for revert: build break

Change-Id: I739fc8cbb7c3c38e74e7fd7d81eeb3842182430a

src/bin/e_policy_wl.c

index 3c513553db88848bb351050a0b9d5dd0b296b934..2112aa41a6e9d20cdac37748ffc3e4f3e426bac1 100644 (file)
@@ -27,6 +27,7 @@ typedef enum _Tzsh_Srv_Role
    TZSH_SRV_ROLE_QUICKPANEL_CONTEXT_MENU,
    TZSH_SRV_ROLE_LOCKSCREEN,
    TZSH_SRV_ROLE_INDICATOR,
+   TZSH_SRV_ROLE_TVSERVICE,
    TZSH_SRV_ROLE_SCREENSAVER_MNG,
    TZSH_SRV_ROLE_SCREENSAVER,
    TZSH_SRV_ROLE_CBHM,
@@ -199,6 +200,7 @@ typedef struct _E_Policy_Wl
    Eina_List       *tzsh_srvs;               /* list of E_Policy_Wl_Tzsh_Srv */
    Eina_List       *tzsh_clients;            /* list of E_Policy_Wl_Tzsh_Client */
    E_Policy_Wl_Tzsh_Srv *srvs[TZSH_SRV_ROLE_MAX]; /* list of registered E_Policy_Wl_Tzsh_Srv */
+   Eina_List       *tvsrv_bind_list;         /* list of activated E_Policy_Wl_Tzsh_Client */
    Eina_List       *tz_indicators;
    Eina_List       *tz_clipboards;           /* list of E_Policy_Wl_Tz_Clipboard */
 
@@ -270,7 +272,10 @@ static const char *hint_names[] =
 };
 
 static void                _e_policy_wl_surf_del(E_Policy_Wl_Surface *psurf);
+static void                _e_policy_wl_tzsh_srv_register_handle(E_Policy_Wl_Tzsh_Srv *tzsh_srv);
+static void                _e_policy_wl_tzsh_srv_unregister_handle(E_Policy_Wl_Tzsh_Srv *tzsh_srv);
 static void                _e_policy_wl_tzsh_srv_state_broadcast(E_Policy_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool reg);
+static void                _e_policy_wl_tzsh_srv_tvsrv_bind_update(void);
 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 void                _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv);
@@ -571,21 +576,53 @@ _e_policy_wl_tzsh_get_from_client(E_Client *ec)
    return NULL;
 }
 
+static E_Policy_Wl_Tzsh_Client *
+_e_policy_wl_tzsh_client_get_from_tzsh(E_Policy_Wl_Tzsh *tzsh)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(polwl->tvsrv_bind_list, l, tzsh_client)
+     {
+        if (tzsh_client->tzsh == tzsh)
+          return tzsh_client;
+     }
+
+   return NULL;
+}
+
 static void
 _e_policy_wl_tzsh_client_set(E_Client *ec)
 {
-   E_Policy_Wl_Tzsh *tzsh;
+   E_Policy_Wl_Tzsh *tzsh, *tzsh2;
+   E_Policy_Wl_Tzsh_Srv *tzsh_srv;
 
    tzsh = _e_policy_wl_tzsh_get_from_client(ec);
    if (!tzsh) return;
 
    tzsh->ec = ec;
+
+   if (tzsh->type == TZSH_TYPE_SRV)
+     {
+        tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_TVSERVICE];
+        if (tzsh_srv)
+          {
+             tzsh2 = tzsh_srv->tzsh;
+             if (tzsh2 == tzsh)
+               _e_policy_wl_tzsh_srv_register_handle(tzsh_srv);
+          }
+     }
+   else
+     {
+        if (_e_policy_wl_tzsh_client_get_from_tzsh(tzsh))
+          _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+     }
 }
 
 static void
 _e_policy_wl_tzsh_client_unset(E_Client *ec)
 {
-   E_Policy_Wl_Tzsh *tzsh;
+   E_Policy_Wl_Tzsh *tzsh, *tzsh2;
    E_Policy_Wl_Tzsh_Srv *tzsh_srv;
 
    tzsh = _e_policy_wl_tzsh_get_from_client(ec);
@@ -593,6 +630,14 @@ _e_policy_wl_tzsh_client_unset(E_Client *ec)
 
    if (tzsh->type == TZSH_TYPE_SRV)
      {
+        tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_TVSERVICE];
+        if (tzsh_srv)
+          {
+             tzsh2 = tzsh_srv->tzsh;
+             if (tzsh2 == tzsh)
+               _e_policy_wl_tzsh_srv_unregister_handle(tzsh_srv);
+          }
+
         tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_SOFTKEY];
         if (tzsh_srv)
           {
@@ -603,6 +648,11 @@ _e_policy_wl_tzsh_client_unset(E_Client *ec)
                }
           }
      }
+   else
+     {
+        if (_e_policy_wl_tzsh_client_get_from_tzsh(tzsh))
+          _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+     }
 }
 
 // --------------------------------------------------------
@@ -624,6 +674,7 @@ _e_policy_wl_tzsh_srv_add(E_Policy_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_
    polwl->srvs[role] = tzsh_srv;
    polwl->tzsh_srvs = eina_list_append(polwl->tzsh_srvs, tzsh_srv);
 
+   _e_policy_wl_tzsh_srv_register_handle(tzsh_srv);
    _e_policy_wl_tzsh_srv_state_broadcast(tzsh_srv, EINA_TRUE);
 
    return tzsh_srv;
@@ -638,6 +689,7 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
      polwl->srvs[tzsh_srv->role] = NULL;
 
    _e_policy_wl_tzsh_srv_state_broadcast(tzsh_srv, EINA_TRUE);
+   _e_policy_wl_tzsh_srv_unregister_handle(tzsh_srv);
 
    if (tzsh_srv->name)
      eina_stringshare_del(tzsh_srv->name);
@@ -701,6 +753,7 @@ _e_policy_wl_tzsh_srv_role_get(const char *name)
    else if (!e_util_strcmp(name, "quickpanel_context_menu"  )) role = TZSH_SRV_ROLE_QUICKPANEL_CONTEXT_MENU;
    else if (!e_util_strcmp(name, "lockscreen"               )) role = TZSH_SRV_ROLE_LOCKSCREEN;
    else if (!e_util_strcmp(name, "indicator"                )) role = TZSH_SRV_ROLE_INDICATOR;
+   else if (!e_util_strcmp(name, "tvsrv"                    )) role = TZSH_SRV_ROLE_TVSERVICE;
    else if (!e_util_strcmp(name, "screensaver_manager"      )) role = TZSH_SRV_ROLE_SCREENSAVER_MNG;
    else if (!e_util_strcmp(name, "screensaver"              )) role = TZSH_SRV_ROLE_SCREENSAVER;
    else if (!e_util_strcmp(name, "cbhm"                     )) role = TZSH_SRV_ROLE_CBHM;
@@ -711,6 +764,115 @@ _e_policy_wl_tzsh_srv_role_get(const char *name)
    return role;
 }
 
+static E_Client *
+_e_policy_wl_tzsh_srv_parent_client_pick(void)
+{
+   E_Policy_Wl_Tzsh *tzsh = NULL;
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+   E_Client *ec = NULL, *ec2;
+   Eina_List *l;
+
+   EINA_LIST_REVERSE_FOREACH(polwl->tvsrv_bind_list, l, tzsh_client)
+     {
+        tzsh = tzsh_client->tzsh;
+        if (!tzsh) continue;
+
+        ec2 = tzsh->ec;
+        if (!ec2) continue;
+        if (!_e_policy_wl_e_client_is_valid(ec2)) continue;
+
+        ec = ec2;
+        break;
+     }
+
+   return ec;
+}
+
+static void
+_e_policy_wl_tzsh_srv_tvsrv_bind_update(void)
+{
+   E_Policy_Wl_Tzsh_Srv *tzsh_srv;
+   E_Client *tzsh_client_ec = NULL;
+   E_Client *tzsh_srv_ec = NULL;
+
+   tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_TVSERVICE];
+   if ((tzsh_srv) && (tzsh_srv->tzsh))
+     tzsh_srv_ec = tzsh_srv->tzsh->ec;
+
+   tzsh_client_ec = _e_policy_wl_tzsh_srv_parent_client_pick();
+
+   if ((tzsh_srv_ec) &&
+       (tzsh_srv_ec->parent == tzsh_client_ec))
+     return;
+
+   if ((tzsh_client_ec) && (tzsh_srv_ec))
+     {
+        ELOGF("TZSH",
+              "TR_SET   |parent_ec:0x%08zx|child_ec:0x%08zx",
+              NULL,
+              e_client_util_win_get(tzsh_client_ec),
+              e_client_util_win_get(tzsh_srv_ec));
+
+        e_policy_stack_transient_for_set(tzsh_srv_ec, tzsh_client_ec);
+        e_client_stack_below(tzsh_srv_ec, tzsh_client_ec);
+     }
+   else
+     {
+        if (tzsh_srv_ec)
+          {
+             ELOGF("TZSH",
+                   "TR_UNSET |                    |child_ec:0x%08zx",
+                   NULL,
+                   e_client_util_win_get(tzsh_srv_ec));
+
+             e_policy_stack_transient_for_set(tzsh_srv_ec, NULL);
+          }
+     }
+}
+
+static void
+_e_policy_wl_tzsh_srv_register_handle(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
+{
+   E_Policy_Wl_Tzsh *tzsh;
+
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
+
+   tzsh = tzsh_srv->tzsh;
+   EINA_SAFETY_ON_NULL_RETURN(tzsh);
+
+   switch (tzsh_srv->role)
+     {
+      case TZSH_SRV_ROLE_TVSERVICE:
+         if (tzsh->ec) tzsh->ec->transient_policy = E_TRANSIENT_BELOW;
+         _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+         break;
+
+      default:
+         break;
+     }
+}
+
+static void
+_e_policy_wl_tzsh_srv_unregister_handle(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
+{
+   E_Policy_Wl_Tzsh *tzsh;
+
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
+
+   tzsh = tzsh_srv->tzsh;
+   EINA_SAFETY_ON_NULL_RETURN(tzsh);
+
+   switch (tzsh_srv->role)
+     {
+      case TZSH_SRV_ROLE_TVSERVICE:
+         _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+         break;
+
+      default:
+         break;
+     }
+}
+
 /* broadcast state of registered service to all subscribers */
 static void
 _e_policy_wl_tzsh_srv_state_broadcast(E_Policy_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool reg)
@@ -762,6 +924,7 @@ _e_policy_wl_tzsh_client_del(E_Policy_Wl_Tzsh_Client *tzsh_client)
      return;
 
    polwl->tzsh_clients = eina_list_remove(polwl->tzsh_clients, tzsh_client);
+   polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
 
    if ((tzsh_client->tzsh) &&
        (tzsh_client->tzsh->ec))
@@ -4863,6 +5026,142 @@ _tzsh_iface_cb_qp_get(struct wl_client *client, struct wl_resource *res_tzsh, ui
                                   _tzsh_cb_qp_destroy);
 }
 
+// --------------------------------------------------------
+// tizen_ws_shell_interface::tvservice
+// --------------------------------------------------------
+static void
+_tzsh_tvsrv_iface_cb_release(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_tvsrv)
+{
+   wl_resource_destroy(res_tzsh_tvsrv);
+}
+
+static void
+_tzsh_tvsrv_iface_cb_bind(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_tvsrv)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+
+   tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
+
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
+   polwl->tvsrv_bind_list = eina_list_append(polwl->tvsrv_bind_list, tzsh_client);
+
+   _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+}
+
+static void
+_tzsh_tvsrv_iface_cb_unbind(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_tvsrv)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+
+   tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
+
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
+   polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
+
+   _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+}
+
+static const struct tws_tvsrv_interface _tzsh_tvsrv_iface =
+{
+   _tzsh_tvsrv_iface_cb_release,
+   _tzsh_tvsrv_iface_cb_bind,
+   _tzsh_tvsrv_iface_cb_unbind
+};
+
+static void
+_tzsh_cb_tvsrv_destroy(struct wl_resource *res_tzsh_tvsrv)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+
+   tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
+
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
+   polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
+   _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+
+   tzsh_client->res_tzsh_client = NULL;
+   _e_policy_wl_tzsh_client_del(tzsh_client);
+}
+
+static void
+_tzsh_iface_cb_tvsrv_get(struct wl_client *client, struct wl_resource *res_tzsh, uint32_t id, uint32_t surf_id)
+{
+   E_Policy_Wl_Tzsh *tzsh;
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+   struct wl_resource *res_tzsh_tvsrv;
+   E_Pixmap *cp;
+   E_Client *ec;
+
+   tzsh = wl_resource_get_user_data(res_tzsh);
+   if (!tzsh)
+     {
+        wl_resource_post_error
+          (res_tzsh,
+           WL_DISPLAY_ERROR_INVALID_OBJECT,
+           "Invalid res_tzsh's user data");
+        return;
+     }
+
+   cp = _e_policy_wl_e_pixmap_get_from_id(client, surf_id);
+   if (!cp)
+     {
+        wl_resource_post_error
+          (res_tzsh,
+           WL_DISPLAY_ERROR_INVALID_OBJECT,
+           "Invalid surface id");
+        return;
+     }
+
+   ec = e_pixmap_client_get(cp);
+   if (ec)
+     {
+        if (!_e_policy_wl_e_client_is_valid(ec))
+          {
+             wl_resource_post_error
+               (res_tzsh,
+                WL_DISPLAY_ERROR_INVALID_OBJECT,
+                "Invalid surface id");
+             return;
+          }
+     }
+
+   res_tzsh_tvsrv = wl_resource_create(client,
+                                       &tws_tvsrv_interface,
+                                       wl_resource_get_version(res_tzsh),
+                                       id);
+   if (!res_tzsh_tvsrv)
+     {
+        ERR("Could not create tws_tvsrv resource: %m");
+        wl_client_post_no_memory(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_tvsrv);
+   if (!tzsh_client)
+     {
+        ERR("Could not create tzsh_client");
+        wl_client_post_no_memory(client);
+        wl_resource_destroy(res_tzsh_tvsrv);
+        return;
+     }
+
+   wl_resource_set_implementation(res_tzsh_tvsrv,
+                                  &_tzsh_tvsrv_iface,
+                                  tzsh_client,
+                                  _tzsh_cb_tvsrv_destroy);
+}
+
 static void _tzsh_iface_cb_extension_get(struct wl_client *client, struct wl_resource *res_tzsh, uint32_t id, const char *name)
 {
    E_Policy_Wl_Tzsh *tzsh;
@@ -5499,6 +5798,7 @@ static const struct tizen_ws_shell_interface _tzsh_iface =
    _tzsh_iface_cb_srv_create,
    _tzsh_iface_cb_reg_create,
    _tzsh_iface_cb_qp_get,
+   _tzsh_iface_cb_tvsrv_get,
    _tzsh_iface_cb_extension_get,
    _tzsh_iface_cb_softkey_get,
    _tzsh_iface_cb_shared_widget_launch_get,