support tzsh_softkey_service protocol 01/193901/3 accepted/tizen/unified/20181128.144719 submit/tizen/20181127.104536
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 27 Nov 2018 09:42:13 +0000 (18:42 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 27 Nov 2018 10:44:32 +0000 (10:44 +0000)
Change-Id: I1ebbc1289994e17a0f815fa109ca0f09d88e35ac

src/bin/Makefile.mk
src/bin/e_config.c
src/bin/e_config.h
src/bin/e_policy_private_data.h
src/bin/e_policy_wl.c
src/bin/services/e_service_softkey.c [new file with mode: 0644]
src/bin/services/e_service_softkey.h [new file with mode: 0644]

index 515b8027ad71cf69b7c518a26c604c971dec0c2a..58fb87380a5db28170ac99cdc7cf07bb38e68141 100644 (file)
@@ -115,6 +115,7 @@ src/bin/services/e_service_volume.h \
 src/bin/services/e_service_indicator.h \
 src/bin/services/e_service_cbhm.h \
 src/bin/services/e_service_scrsaver.h \
+src/bin/services/e_service_softkey.h \
 src/bin/e_policy.h \
 src/bin/e_policy_conformant.h \
 src/bin/e_policy_visibility.h \
@@ -223,6 +224,7 @@ src/bin/services/e_service_volume.c \
 src/bin/services/e_service_indicator.c \
 src/bin/services/e_service_cbhm.c \
 src/bin/services/e_service_scrsaver.c \
+src/bin/services/e_service_softkey.c \
 src/bin/e_policy.c \
 src/bin/e_policy_conformant.c \
 src/bin/e_policy_softkey.c \
index 9c13946cdcc00164a1823a227c8945c1c0fff35a..0ab735e3b581d9e9f3c8737d92a75f415d750653 100644 (file)
@@ -182,6 +182,7 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, launcher.clas, STR);
    E_CONFIG_VAL(D, T, launcher.type, UINT);
    E_CONFIG_LIST(D, T, policy_desks, _e_config_policy_desk_edd);
+   E_CONFIG_VAL(D, T, use_softkey_service, INT);
    E_CONFIG_VAL(D, T, use_softkey, INT);
    E_CONFIG_VAL(D, T, softkey_size, INT);
    E_CONFIG_VAL(D, T, focus_policy, INT);
@@ -453,6 +454,7 @@ e_config_load(void)
    E_CONFIG_LIMIT(e_config->zone_desks_x_count, 1, 64);
    E_CONFIG_LIMIT(e_config->zone_desks_y_count, 1, 64);
    E_CONFIG_LIMIT(e_config->use_e_policy, 0, 1);
+   E_CONFIG_LIMIT(e_config->use_softkey_service, 0, 1);
    E_CONFIG_LIMIT(e_config->use_softkey, 0, 1);
    E_CONFIG_LIMIT(e_config->softkey_size, 0, 42);
    E_CONFIG_LIMIT(e_config->window_placement_policy, E_WINDOW_PLACEMENT_SMART, E_WINDOW_PLACEMENT_MANUAL);
index ac4d92080b96b2ef60572c59c63f935cbd15e9ac..b27eb0f61d4bbd88b9d2df9d526a09eadff51998 100644 (file)
@@ -49,6 +49,7 @@ struct _E_Config
         unsigned int  type;
      } launcher;
    Eina_List  *policy_desks;
+   int         use_softkey_service;
    int         use_softkey;
    int         softkey_size;
    int         window_placement_policy;
index ac1f4e38383119ffb1bda389bd8265d2eb7b460a..7ed3581ff169423907aa45e4a9aefcb56ca56e1f 100644 (file)
@@ -34,6 +34,9 @@ e_policy_angle_get(E_Policy_Angle_Map map)
    return map * 90;
 }
 
+/* layer level - E_LAYER_CLIENT_ALERT_HIGH (950) */
+# define E_POLICY_SOFTKEY_LAYER     E_LAYER_CLIENT_ALERT_HIGH
+
 /* layer level - E_LAYER_CLIENT_ALERT (900) */
 # define E_POLICY_SCRSAVER_LAYER    E_LAYER_CLIENT_ALERT
 # define E_POLICY_VOLUME_LAYER      E_LAYER_CLIENT_ALERT
index 03ee925cc062e71e3a10bbc916ce58016787c0c7..8631a73303048915d780e1a12893f528b87b3017 100644 (file)
@@ -6,6 +6,7 @@
 #include "services/e_service_indicator.h"
 #include "services/e_service_cbhm.h"
 #include "services/e_service_scrsaver.h"
+#include "services/e_service_softkey.h"
 #include "e_policy_wl_display.h"
 #include "e_policy_conformant_internal.h"
 #include "e_policy_visibility.h"
@@ -30,6 +31,7 @@ typedef enum _Tzsh_Srv_Role
    TZSH_SRV_ROLE_SCREENSAVER_MNG,
    TZSH_SRV_ROLE_SCREENSAVER,
    TZSH_SRV_ROLE_CBHM,
+   TZSH_SRV_ROLE_SOFTKEY,
    TZSH_SRV_ROLE_MAX
 } Tzsh_Srv_Role;
 
@@ -528,6 +530,16 @@ _e_policy_wl_tzsh_client_unset(E_Client *ec)
              if (tzsh2 == tzsh)
                _e_policy_wl_tzsh_srv_unregister_handle(tzsh_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;
+               }
+          }
      }
    else
      {
@@ -588,6 +600,16 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
 
         _indicator_srv_res = NULL;
      }
+   else if (tzsh_srv->role == TZSH_SRV_ROLE_SOFTKEY)
+     {
+        E_Client *softkey_ec = NULL;
+
+        softkey_ec = tzsh_srv->tzsh->ec;
+        if (softkey_ec)
+          {
+             e_service_softkey_client_unset(softkey_ec);
+          }
+     }
 
    memset(tzsh_srv, 0x0, sizeof(E_Policy_Wl_Tzsh_Srv));
    E_FREE(tzsh_srv);
@@ -607,6 +629,7 @@ _e_policy_wl_tzsh_srv_role_get(const char *name)
    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;
+   else if (!e_util_strcmp(name, "softkey"            )) role = TZSH_SRV_ROLE_SOFTKEY;
 
    return role;
 }
@@ -3546,6 +3569,87 @@ _tzsh_srv_iface_cb_quickpanel_get(struct wl_client *client, struct wl_resource *
    wl_resource_set_implementation(res, &_tzsh_srv_qp_iface, tzsh_srv, NULL);
 }
 
+
+
+static void
+_tzsh_srv_softkey_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static void
+_tzsh_srv_softkey_cb_msg_send(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t msg)
+{
+   E_Policy_Wl_Tzsh_Srv *tzsh_srv;
+   E_Service_Softkey *softkey;
+   E_Client *softkey_ec;
+
+   tzsh_srv = wl_resource_get_user_data(resource);
+
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
+
+   softkey_ec = tzsh_srv->tzsh->ec;
+   EINA_SAFETY_ON_NULL_RETURN(softkey_ec);
+
+   softkey = e_service_softkey_get(softkey_ec->zone);
+   EINA_SAFETY_ON_NULL_RETURN(softkey);
+
+   switch (msg)
+     {
+      case TWS_SERVICE_SOFTKEY_MSG_SHOW:
+         e_service_softkey_show(softkey);
+         break;
+      case TWS_SERVICE_SOFTKEY_MSG_HIDE:
+         e_service_softkey_hide(softkey);
+         break;
+      default:
+         ERR("Unknown message!! msg %d", msg);
+         break;
+     }
+}
+
+static const struct tws_service_softkey_interface _tzsh_srv_softkey_iface =
+{
+   _tzsh_srv_softkey_cb_destroy,
+   _tzsh_srv_softkey_cb_msg_send,
+};
+
+static void
+_tzsh_srv_iface_cb_softkey_get(struct wl_client *client, struct wl_resource *res_tzsh_srv, uint32_t id)
+{
+   E_Policy_Wl_Tzsh_Srv *tzsh_srv;
+   E_Service_Softkey *softkey = NULL;
+   struct wl_resource *res;
+
+   tzsh_srv = wl_resource_get_user_data(res_tzsh_srv);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
+
+   if (!eina_list_data_find(polwl->tzsh_srvs, tzsh_srv))
+     return;
+
+   res = wl_resource_create(client, &tws_service_softkey_interface, 1, id);
+   if (!res)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   ELOGF("TZSH", "[SOFTKEY SERVICE] resource created. res:%p, res_tzsh_srv:%p, id:%d", NULL, NULL, res, res_tzsh_srv, id);
+
+   if (tzsh_srv->tzsh && tzsh_srv->tzsh->ec)
+     {
+        E_Client *softkey_ec = tzsh_srv->tzsh->ec;
+        softkey = e_service_softkey_get(softkey_ec->zone);
+        ELOGF("TZSH", "[SOFTKEY SERVICE] resource set. res:%p, softkey:%p, softkey_ec:%p", NULL, NULL, res, softkey, softkey_ec);
+        if (softkey)
+          e_service_softkey_wl_resource_set(softkey, res);
+     }
+
+   wl_resource_set_implementation(res, &_tzsh_srv_softkey_iface, tzsh_srv, NULL);
+}
+
+
 //////////////////////////////////////////////////////////////////////////////////////////////////////
 static void
 _tzsh_srv_scrsaver_cb_release(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
@@ -3775,6 +3879,7 @@ static const struct tws_service_interface _tzsh_srv_iface =
    _tzsh_srv_iface_cb_scrsaver_mng_get,
    _tzsh_srv_iface_cb_scrsaver_get,
    _tzsh_srv_iface_cb_cbhm_get,
+   _tzsh_srv_iface_cb_softkey_get,
 };
 
 static void
@@ -3903,6 +4008,8 @@ _tzsh_iface_cb_srv_create(struct wl_client *client, struct wl_resource *res_tzsh
      e_mod_indicator_client_set(tzsh->ec);
    else if (role == TZSH_SRV_ROLE_CBHM)
      e_service_cbhm_client_set(tzsh->ec);
+   else if (role == TZSH_SRV_ROLE_SOFTKEY)
+     e_service_softkey_client_set(tzsh->ec);
 }
 
 // --------------------------------------------------------
@@ -4752,7 +4859,7 @@ _tzsh_softkey_iface_cb_support_check(struct wl_client *client EINA_UNUSED, struc
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   if (e_config->use_softkey)
+   if (e_config->use_softkey || e_config->use_softkey_service)
      support = 1;
    else
      support = 0;
@@ -4764,12 +4871,12 @@ _tzsh_softkey_iface_cb_support_check(struct wl_client *client EINA_UNUSED, struc
 static void
 _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
 {
-   E_Policy_Softkey *softkey;
    E_Policy_Wl_Tzsh_Client *tzsh_client;
 
    ELOGF("TZ_SOFTKEY", "Request to Show softkey", NULL, NULL);
 
-   if (!e_config->use_softkey) return;
+   if (!e_config->use_softkey && !e_config->use_softkey_service)
+     return;
 
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
@@ -4779,23 +4886,38 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
-   if (softkey)
+   if (e_config->use_softkey)
      {
-        ELOGF("TZ_SOFTKEY", "SHOW softkey", NULL, NULL);
-        e_policy_softkey_show(softkey);
+        E_Policy_Softkey *softkey;
+        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (softkey)
+          {
+             ELOGF("TZ_SOFTKEY", "SHOW softkey", NULL, NULL);
+             e_policy_softkey_show(softkey);
+          }
+     }
+
+   if (e_config->use_softkey_service)
+     {
+        E_Service_Softkey *softkey;
+        softkey = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (softkey)
+          {
+             ELOGF("TZ_SOFTKEY", "Request to SHOW softkey. (service:%p)", NULL, NULL, softkey);
+             e_service_softkey_visible_set(softkey, 1);
+          }
      }
 }
 
 static void
 _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
 {
-   E_Policy_Softkey *softkey;
    E_Policy_Wl_Tzsh_Client *tzsh_client;
 
    ELOGF("TZ_SOFTKEY", "Request to Hide softkey", NULL, NULL);
 
-   if (!e_config->use_softkey) return;
+   if (!e_config->use_softkey && !e_config->use_softkey_service)
+     return;
 
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
@@ -4805,25 +4927,40 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
-   if (softkey)
+   if (e_config->use_softkey)
      {
-        ELOGF("TZ_SOFTKEY", "HIDE softkey", NULL, NULL);
-        e_policy_softkey_hide(softkey);
+        E_Policy_Softkey *softkey;
+        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (softkey)
+          {
+             ELOGF("TZ_SOFTKEY", "HIDE softkey", NULL, NULL);
+             e_policy_softkey_hide(softkey);
+          }
+     }
+
+   if (e_config->use_softkey_service)
+     {
+        E_Service_Softkey *softkey;
+        softkey = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (softkey)
+          {
+             ELOGF("TZ_SOFTKEY", "Request to HIDE softkey. (service:%p)", NULL, NULL, softkey);
+             e_service_softkey_visible_set(softkey, 0);
+          }
      }
 }
 
 static void
 _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey, int32_t type, int32_t val)
 {
-   E_Policy_Softkey *softkey;
    E_Policy_Wl_Tzsh_Client *tzsh_client;
    E_Policy_Softkey_Expand expand;
    E_Policy_Softkey_Opacity opacity;
 
    ELOGF("TZ_SOFTKEY", "Request to Set state (tz_type:%d, tz_val:%d)", NULL, NULL, type, val);
 
-   if (!e_config->use_softkey) return;
+   if (!e_config->use_softkey && !e_config->use_softkey_service)
+     return;
 
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
@@ -4833,40 +4970,77 @@ _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
-   if (!softkey) return;
-
-   switch (type)
+   if (e_config->use_softkey)
      {
-      case TWS_SOFTKEY_STATE_EXPAND:
-         if (val == TWS_SOFTKEY_STATE_EXPAND_ON)
-           expand = E_POLICY_SOFTKEY_EXPAND_ON;
-         else
-           expand = E_POLICY_SOFTKEY_EXPAND_OFF;
+        E_Policy_Softkey *softkey;
+        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (!softkey) return;
 
-         ELOGF("TZ_SOFTKEY", "Set EXPAND state to %d", NULL, NULL, expand);
-         e_policy_softkey_expand_set(softkey, expand);
-         break;
+        switch (type)
+          {
+           case TWS_SOFTKEY_STATE_EXPAND:
+              if (val == TWS_SOFTKEY_STATE_EXPAND_ON)
+                expand = E_POLICY_SOFTKEY_EXPAND_ON;
+              else
+                expand = E_POLICY_SOFTKEY_EXPAND_OFF;
+
+              ELOGF("TZ_SOFTKEY", "Set EXPAND state to %d", NULL, NULL, expand);
+              e_policy_softkey_expand_set(softkey, expand);
+              break;
+
+           case TWS_SOFTKEY_STATE_OPACITY:
+              if (val == TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT)
+                opacity = E_POLICY_SOFTKEY_OPACITY_TRANSPARENT;
+              else
+                opacity = E_POLICY_SOFTKEY_OPACITY_OPAQUE;
+
+              ELOGF("TZ_SOFTKEY", "Set OPACITY state to %d", NULL, NULL, opacity);
+              e_policy_softkey_opacity_set(softkey, opacity);
+              break;
+
+           default:
+              break;
+          }
+     }
 
-      case TWS_SOFTKEY_STATE_OPACITY:
-         if (val == TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT)
-           opacity = E_POLICY_SOFTKEY_OPACITY_TRANSPARENT;
-         else
-           opacity = E_POLICY_SOFTKEY_OPACITY_OPAQUE;
+   if (e_config->use_softkey_service)
+     {
+        E_Service_Softkey *softkey;
 
-         ELOGF("TZ_SOFTKEY", "Set OPACITY state to %d", NULL, NULL, opacity);
-         e_policy_softkey_opacity_set(softkey, opacity);
-         break;
+        softkey = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (!softkey) return;
 
-      default:
-         break;
+        switch (type)
+          {
+           case TWS_SOFTKEY_STATE_EXPAND:
+              if (val == TWS_SOFTKEY_STATE_EXPAND_ON)
+                expand = E_POLICY_SOFTKEY_EXPAND_ON;
+              else
+                expand = E_POLICY_SOFTKEY_EXPAND_OFF;
+
+              ELOGF("TZ_SOFTKEY", "Request to Change EXPAND state to %d. (service:%p)", NULL, NULL, expand, softkey);
+              e_service_softkey_expand_set(softkey, expand);
+              break;
+
+           case TWS_SOFTKEY_STATE_OPACITY:
+              if (val == TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT)
+                opacity = E_POLICY_SOFTKEY_OPACITY_TRANSPARENT;
+              else
+                opacity = E_POLICY_SOFTKEY_OPACITY_OPAQUE;
+
+              ELOGF("TZ_SOFTKEY", "Request to Change OPACITY state to %d. (service:%p)", NULL, NULL, opacity, softkey);
+              e_service_softkey_opacity_set(softkey, opacity);
+              break;
+
+           default:
+              break;
+          }
      }
 }
 
 static void
 _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey, int32_t type)
 {
-   E_Policy_Softkey *softkey;
    E_Policy_Wl_Tzsh_Client *tzsh_client;
    E_Policy_Softkey_Expand expand;
    E_Policy_Softkey_Opacity opacity;
@@ -4875,7 +5049,8 @@ _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl
 
    ELOGF("TZ_SOFTKEY", "Request to Get state (tz_type:%d)", NULL, NULL, type);
 
-   if (!e_config->use_softkey) return;
+   if (!e_config->use_softkey && !e_config->use_softkey_service)
+     return;
 
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
@@ -4885,46 +5060,96 @@ _tzsh_softkey_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
-   if (!softkey) return;
-
-   switch (type)
+   if (e_config->use_softkey)
      {
-      case TWS_SOFTKEY_STATE_VISIBLE:
-         visible = e_policy_softkey_visible_get(softkey);
-         if (visible)
-           val = TWS_SOFTKEY_STATE_VISIBLE_SHOW;
-         else
-           val = TWS_SOFTKEY_STATE_VISIBLE_HIDE;
-
-         ELOGF("TZ_SOFTKEY", "Send current VISIBLE state: %d (tz_val:%d)", NULL, NULL, visible, val);
-         tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
-         break;
+        E_Policy_Softkey *softkey;
+        softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (!softkey) return;
 
-      case TWS_SOFTKEY_STATE_EXPAND:
-         e_policy_softkey_expand_get(softkey, &expand);
-         if (expand == E_POLICY_SOFTKEY_EXPAND_ON)
-           val = TWS_SOFTKEY_STATE_EXPAND_ON;
-         else
-           val = TWS_SOFTKEY_STATE_EXPAND_OFF;
-
-         ELOGF("TZ_SOFTKEY", "Send current EXPAND state: %d (tz_val:%d)", NULL, NULL, expand, val);
-         tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
-         break;
-
-      case TWS_SOFTKEY_STATE_OPACITY:
-         e_policy_softkey_opacity_get(softkey, &opacity);
-         if (opacity == E_POLICY_SOFTKEY_OPACITY_TRANSPARENT)
-           val = TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT;
-         else
-           val = TWS_SOFTKEY_STATE_OPACITY_OPAQUE;
+        switch (type)
+          {
+           case TWS_SOFTKEY_STATE_VISIBLE:
+              visible = e_policy_softkey_visible_get(softkey);
+              if (visible)
+                val = TWS_SOFTKEY_STATE_VISIBLE_SHOW;
+              else
+                val = TWS_SOFTKEY_STATE_VISIBLE_HIDE;
+
+              ELOGF("TZ_SOFTKEY", "Send current VISIBLE state: %d (tz_val:%d)", NULL, NULL, visible, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           case TWS_SOFTKEY_STATE_EXPAND:
+              e_policy_softkey_expand_get(softkey, &expand);
+              if (expand == E_POLICY_SOFTKEY_EXPAND_ON)
+                val = TWS_SOFTKEY_STATE_EXPAND_ON;
+              else
+                val = TWS_SOFTKEY_STATE_EXPAND_OFF;
+
+              ELOGF("TZ_SOFTKEY", "Send current EXPAND state: %d (tz_val:%d)", NULL, NULL, expand, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           case TWS_SOFTKEY_STATE_OPACITY:
+              e_policy_softkey_opacity_get(softkey, &opacity);
+              if (opacity == E_POLICY_SOFTKEY_OPACITY_TRANSPARENT)
+                val = TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT;
+              else
+                val = TWS_SOFTKEY_STATE_OPACITY_OPAQUE;
+
+              ELOGF("TZ_SOFTKEY", "Send current OPACITY state: %d (tz_val:%d)", NULL, NULL, opacity, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           default:
+              break;
+          }
+     }
 
-         ELOGF("TZ_SOFTKEY", "Send current OPACITY state: %d (tz_val:%d)", NULL, NULL, opacity, val);
-         tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
-         break;
+   if (e_config->use_softkey_service)
+     {
+        E_Service_Softkey *softkey;
+        softkey = e_service_softkey_get(tzsh_client->tzsh->ec->zone);
+        if (!softkey) return;
 
-      default:
-         break;
+        switch (type)
+          {
+           case TWS_SOFTKEY_STATE_VISIBLE:
+              visible = e_service_softkey_visible_get(softkey);
+              if (visible)
+                val = TWS_SOFTKEY_STATE_VISIBLE_SHOW;
+              else
+                val = TWS_SOFTKEY_STATE_VISIBLE_HIDE;
+
+              ELOGF("TZ_SOFTKEY", "Send service's current VISIBLE state: %d (tz_val:%d)", NULL, NULL, visible, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           case TWS_SOFTKEY_STATE_EXPAND:
+              e_service_softkey_expand_get(softkey, &expand);
+              if (expand == E_POLICY_SOFTKEY_EXPAND_ON)
+                val = TWS_SOFTKEY_STATE_EXPAND_ON;
+              else
+                val = TWS_SOFTKEY_STATE_EXPAND_OFF;
+
+              ELOGF("TZ_SOFTKEY", "Send service's current EXPAND state: %d (tz_val:%d)", NULL, NULL, expand, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           case TWS_SOFTKEY_STATE_OPACITY:
+              e_service_softkey_opacity_get(softkey, &opacity);
+              if (opacity == E_POLICY_SOFTKEY_OPACITY_TRANSPARENT)
+                val = TWS_SOFTKEY_STATE_OPACITY_TRANSPARENT;
+              else
+                val = TWS_SOFTKEY_STATE_OPACITY_OPAQUE;
+
+              ELOGF("TZ_SOFTKEY", "Send service's current OPACITY state: %d (tz_val:%d)", NULL, NULL, opacity, val);
+              tws_softkey_send_state_get_done(res_tzsh_softkey, type, val, 0);
+              break;
+
+           default:
+              break;
+          }
      }
 }
 
@@ -6545,9 +6770,10 @@ e_policy_wl_init(void)
 
    global = wl_global_create(e_comp_wl->wl.disp,
                              &tizen_ws_shell_interface,
-                             1,
+                             2,
                              NULL,
                              _tzsh_cb_bind);
+
    EINA_SAFETY_ON_NULL_GOTO(global, err);
    polwl->globals = eina_list_append(polwl->globals, global);
 
diff --git a/src/bin/services/e_service_softkey.c b/src/bin/services/e_service_softkey.c
new file mode 100644 (file)
index 0000000..861d54c
--- /dev/null
@@ -0,0 +1,444 @@
+#include "e.h"
+#include <tzsh_server.h>
+#include "services/e_service_softkey.h"
+#include "services/e_service_gesture.h"
+#include "services/e_service_region.h"
+#include "e_policy_wl.h"
+
+#define SOFTKEY_SHOW(softkey)                 \
+do                                            \
+{                                             \
+   if (softkey->ec && !softkey->ec->visible)  \
+     {                                        \
+        softkey->show_block = EINA_FALSE;     \
+        softkey->ec->visible = EINA_TRUE;     \
+        evas_object_show(softkey->ec->frame); \
+     }                                        \
+} while (0)
+
+#define SOFTKEY_HIDE(softkey)                 \
+do                                            \
+{                                             \
+   if (softkey->ec && softkey->ec->visible)   \
+     {                                        \
+        softkey->show_block = EINA_TRUE;      \
+        softkey->ec->visible = EINA_FALSE;    \
+        evas_object_hide(softkey->ec->frame); \
+     }                                        \
+} while (0)
+
+static Eina_List *_e_softkey_list;
+static E_Service_Softkey_Funcs *_e_softkey_funcs = NULL;
+
+E_API Eina_Bool
+e_service_softkey_module_func_set(E_Service_Softkey_Funcs *fp)
+{
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(e_config->use_softkey_service, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL((_e_softkey_funcs == NULL), EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fp, EINA_FALSE);
+
+   _e_softkey_funcs = E_NEW(E_Service_Softkey_Funcs, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_e_softkey_funcs, EINA_FALSE);
+
+   _e_softkey_funcs->softkey_service_add = fp->softkey_service_add;
+   _e_softkey_funcs->softkey_service_del = fp->softkey_service_del;
+   _e_softkey_funcs->softkey_service_wl_resource_set = fp->softkey_service_wl_resource_set;
+   _e_softkey_funcs->softkey_service_wl_resource_get = fp->softkey_service_wl_resource_get;
+   _e_softkey_funcs->softkey_service_client_set = fp->softkey_service_client_set;
+   _e_softkey_funcs->softkey_service_client_unset = fp->softkey_service_client_unset;
+   _e_softkey_funcs->softkey_service_show = fp->softkey_service_show;
+   _e_softkey_funcs->softkey_service_hide = fp->softkey_service_hide;
+   _e_softkey_funcs->softkey_service_visible_set = fp->softkey_service_visible_set;
+   _e_softkey_funcs->softkey_service_visible_get = fp->softkey_service_visible_get;
+   _e_softkey_funcs->softkey_service_expand_set = fp->softkey_service_expand_set;
+   _e_softkey_funcs->softkey_service_expand_get = fp->softkey_service_expand_get;
+   _e_softkey_funcs->softkey_service_opacity_set = fp->softkey_service_opacity_set;
+   _e_softkey_funcs->softkey_service_opacity_get = fp->softkey_service_opacity_get;
+   _e_softkey_funcs->softkey_service_get = fp->softkey_service_get;
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_service_softkey_module_func_unset(void)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_e_softkey_funcs, EINA_FALSE);
+
+   E_FREE(_e_softkey_funcs);
+
+   return EINA_TRUE;
+}
+
+E_API E_Service_Softkey *
+e_service_softkey_add(E_Zone *zone, E_Client *ec)
+{
+   ELOGF("SOFTKEY_SRV", "%s (zone:%p)", NULL, ec, __func__, zone);
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_add)
+     {
+        return _e_softkey_funcs->softkey_service_add(zone, ec);
+     }
+
+   if (!zone || !ec) return NULL;
+
+   E_Service_Softkey *softkey;
+
+   ELOGF("SOFTKEY_SRV", "Softkey service window add... win:%x (ec:%p), zone:%p (id:%d)", NULL, NULL, e_client_util_win_get(ec), ec, zone, zone->id);
+   softkey = E_NEW(E_Service_Softkey, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(softkey, NULL);
+
+   _e_softkey_list = eina_list_append(_e_softkey_list, softkey);
+
+   softkey->zone = zone;
+   softkey->ec = ec;
+
+   return softkey;
+}
+
+E_API void
+e_service_softkey_del(E_Service_Softkey *softkey)
+{
+   ELOGF("SOFTKEY_SRV", "%s (softkey:%p)", NULL, NULL, __func__, softkey);
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_del)
+     {
+        _e_softkey_funcs->softkey_service_del(softkey);
+        return;
+     }
+
+   if (!softkey) return;
+
+   _e_softkey_list = eina_list_remove(_e_softkey_list , softkey);
+
+   E_FREE_LIST(softkey->intercept_hooks, e_comp_object_intercept_hook_del);
+
+   E_FREE(softkey);
+
+}
+
+E_API Eina_Bool
+e_service_softkey_wl_resource_set(E_Service_Softkey *softkey, struct wl_resource *wl_res)
+{
+   ELOGF("SOFTKEY_SRV", "%s (softkey:%p, res:%p)", NULL, NULL, __func__, softkey, wl_res);
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_wl_resource_set)
+     {
+        return _e_softkey_funcs->softkey_service_wl_resource_set(softkey, wl_res);
+     }
+
+   if (!softkey)
+     return EINA_FALSE;
+
+   ELOGF("SOFTKEY_SRV", "SET Softkey service wl res:%p. softkey(%p), win(%x), ec(%p)", NULL, NULL, wl_res, softkey, e_client_util_win_get(softkey->ec), softkey->ec);
+   softkey->wl_res = wl_res;
+
+   return EINA_TRUE;
+}
+
+E_API struct wl_resource *
+e_service_softkey_wl_resource_get(E_Service_Softkey *softkey)
+{
+   ELOGF("SOFTKEY_SRV", "%s (softkey:%p)", NULL, NULL, __func__, softkey);
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_wl_resource_get)
+     {
+        return _e_softkey_funcs->softkey_service_wl_resource_get(softkey);
+     }
+
+   if (!softkey)
+     return NULL;
+
+   return softkey->wl_res;
+}
+
+static Eina_Bool
+_softkey_intercept_hook_show(void *data, E_Client *ec)
+{
+   E_Service_Softkey *softkey;
+
+   softkey = data;
+   if (EINA_UNLIKELY(!softkey))
+     goto end;
+
+   if (softkey->ec != ec)
+     goto end;
+
+   if (softkey->show_block)
+     {
+        ec->visible = EINA_FALSE;
+        return EINA_FALSE;
+     }
+
+   ec->visible = EINA_TRUE;
+
+end:
+   return EINA_TRUE;
+}
+
+#undef E_COMP_OBJECT_INTERCEPT_HOOK_APPEND
+#define E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(l, t, cb, d) \
+  do                                                     \
+    {                                                    \
+       E_Comp_Object_Intercept_Hook *_h;                 \
+       _h = e_comp_object_intercept_hook_add(t, cb, d);  \
+       assert(_h);                                       \
+       l = eina_list_append(l, _h);                      \
+    }                                                    \
+  while (0)
+
+EINTERN void
+e_service_softkey_client_set(E_Client *ec)
+{
+   ELOGF("SOFTKEY_SRV", "%s", NULL, ec, __func__);
+
+   E_Service_Softkey *softkey;
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_client_set)
+     {
+        _e_softkey_funcs->softkey_service_client_set(ec);
+        return;
+     }
+
+   if (!ec) return;
+
+   /* check for client being deleted */
+   if (e_object_is_del(E_OBJECT(ec))) return;
+
+   /* check for wayland pixmap */
+   if (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_WL) return;
+
+   ELOGF("SOFTKEY_SRV", "SET Softkey service", ec->pixmap, ec);
+
+   softkey = e_service_softkey_get(ec->zone);
+   if (!softkey)
+     softkey = e_service_softkey_add(ec->zone, ec);
+   else
+     {
+        if (softkey->ec != ec)
+          {
+             e_service_softkey_del(softkey);
+             softkey = e_service_softkey_add(ec->zone, ec);
+          }
+     }
+
+   if (!softkey)
+     return;
+
+   ELOGF("SOFTKEY", "Set Client | softkey %p", ec->pixmap, ec, softkey);
+
+   softkey->ec = ec;
+   e_client_window_role_set(ec, "softkey");
+
+   // set softkey layer
+   if (E_POLICY_SOFTKEY_LAYER != evas_object_layer_get(ec->frame))
+     {
+        evas_object_layer_set(ec->frame, E_POLICY_SOFTKEY_LAYER);
+     }
+   ec->layer = E_POLICY_SOFTKEY_LAYER;
+
+   // set skip iconify
+   ec->exp_iconify.skip_iconify = 1;
+
+   // set skip focus
+   ec->icccm.accepts_focus = ec->icccm.take_focus = 0;
+
+   // disable effect
+   e_policy_animatable_lock(ec, E_POLICY_ANIMATABLE_NEVER, EINA_TRUE);
+
+   E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(softkey->intercept_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _softkey_intercept_hook_show, softkey);
+}
+
+EINTERN void
+e_service_softkey_client_unset(E_Client *ec)
+{
+   ELOGF("SOFTKEY_SRV", "%s", NULL, ec, __func__);
+
+   E_Service_Softkey *softkey;
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_client_unset)
+     {
+        _e_softkey_funcs->softkey_service_client_unset(ec);
+        return;
+     }
+
+   softkey = e_service_softkey_get(ec->zone);
+   if (!softkey) return;
+
+   e_service_softkey_del(softkey);
+}
+
+EINTERN void
+e_service_softkey_show(E_Service_Softkey *softkey)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_show)
+     {
+        _e_softkey_funcs->softkey_service_show(softkey);
+        return;
+     }
+
+   if (!softkey) return;
+   if (!softkey->ec) return;
+
+   SOFTKEY_SHOW(softkey);
+}
+
+EINTERN void
+e_service_softkey_hide(E_Service_Softkey *softkey)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_hide)
+     {
+        _e_softkey_funcs->softkey_service_hide(softkey);
+        return;
+     }
+
+   if (!softkey) return;
+   if (!softkey->ec) return;
+
+   SOFTKEY_HIDE(softkey);
+}
+
+
+EINTERN void
+e_service_softkey_visible_set(E_Service_Softkey *softkey, int visible)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_visible_set)
+     {
+        _e_softkey_funcs->softkey_service_visible_set(softkey, visible);
+        return;
+     }
+
+   if (!softkey) return;
+   if (!softkey->wl_res)
+     {
+        ELOGF("SOFTKEY_SRV", "Error. No wl_resource of Softkey Service", NULL, NULL);
+        return;
+     }
+
+   tws_service_softkey_send_visible_change_request(softkey->wl_res, visible);
+}
+
+
+EINTERN int
+e_service_softkey_visible_get(E_Service_Softkey *softkey)
+{
+   int visible;
+
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_visible_get)
+     {
+        return _e_softkey_funcs->softkey_service_visible_get(softkey);
+     }
+
+   if (!softkey) return 0;
+   if (!softkey->ec) return 0;
+
+   visible = evas_object_visible_get(softkey->ec->frame);
+   return visible;
+}
+
+EINTERN void
+e_service_softkey_expand_set(E_Service_Softkey *softkey, E_Policy_Softkey_Expand expand)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_expand_set)
+     {
+        _e_softkey_funcs->softkey_service_expand_set(softkey, expand);
+        return;
+     }
+
+   if (!softkey) return;
+   if (!softkey->wl_res)
+     {
+        ELOGF("SOFTKEY_SRV", "Error. No wl_resource of Softkey Service", NULL, NULL);
+        return;
+     }
+
+   tws_service_softkey_send_expand_change_request(softkey->wl_res, expand);
+   softkey->expand = expand;
+}
+
+EINTERN Eina_Bool
+e_service_softkey_expand_get(E_Service_Softkey *softkey, E_Policy_Softkey_Expand *expand)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_expand_get)
+     {
+        return _e_softkey_funcs->softkey_service_expand_get(softkey, expand);
+     }
+
+   if (!softkey)
+     {
+        if (expand)
+          *expand = E_POLICY_SOFTKEY_EXPAND_OFF;
+
+        return EINA_FALSE;
+     }
+   else
+     {
+        if (expand)
+          *expand = softkey->expand;
+
+        return EINA_TRUE;
+     }
+}
+
+EINTERN void
+e_service_softkey_opacity_set(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity opacity)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_opacity_set)
+     {
+        _e_softkey_funcs->softkey_service_opacity_set(softkey, opacity);
+        return;
+     }
+
+   if (!softkey) return;
+   if (!softkey->wl_res)
+     {
+        ELOGF("SOFTKEY_SRV", "Error. No wl_resource of Softkey Service", NULL, NULL);
+        return;
+     }
+
+   tws_service_softkey_send_opacity_change_request(softkey->wl_res, opacity);
+   softkey->opacity = opacity;
+}
+
+EINTERN Eina_Bool
+e_service_softkey_opacity_get(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity *opacity)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_opacity_get)
+     {
+        return _e_softkey_funcs->softkey_service_opacity_get(softkey, opacity);
+     }
+
+   if (!softkey)
+     {
+        if (opacity)
+          *opacity = E_POLICY_SOFTKEY_OPACITY_OPAQUE;
+
+        return EINA_FALSE;
+     }
+   else
+     {
+        if (opacity)
+          *opacity = softkey->opacity;
+
+        return EINA_TRUE;
+     }
+}
+
+E_API E_Service_Softkey *
+e_service_softkey_get(E_Zone *zone)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_get)
+     {
+        return _e_softkey_funcs->softkey_service_get(zone);
+     }
+
+   Eina_List *l;
+   E_Service_Softkey *softkey = NULL;
+
+   EINA_LIST_FOREACH(_e_softkey_list, l, softkey)
+     {
+        if (softkey->zone == zone)
+          return softkey;
+     }
+
+   return softkey;
+}
diff --git a/src/bin/services/e_service_softkey.h b/src/bin/services/e_service_softkey.h
new file mode 100644 (file)
index 0000000..1342e7e
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef E_SERVICE_SOFTKEY_H
+#define E_SERVICE_SOFTKEY_H
+
+#include "e_policy_private_data.h"
+
+typedef struct _E_Service_Softkey E_Service_Softkey;
+typedef struct _E_Service_Softkey_Funcs E_Service_Softkey_Funcs;
+
+struct _E_Service_Softkey
+{
+   E_Zone *zone;
+   E_Client *ec;
+   struct wl_resource *wl_res;
+   E_Policy_Softkey_Expand expand;
+   E_Policy_Softkey_Opacity opacity;
+   Eina_List *intercept_hooks;
+   Eina_Bool show_block;
+};
+
+struct _E_Service_Softkey_Funcs
+{
+   E_Service_Softkey*  (*softkey_service_add)(E_Zone *zone, E_Client *ec);
+   void                (*softkey_service_del)(E_Service_Softkey *softkey);
+   Eina_Bool           (*softkey_service_wl_resource_set)(E_Service_Softkey *softkey, struct wl_resource *wl_res);
+   struct wl_resource* (*softkey_service_wl_resource_get)(E_Service_Softkey *softkey);
+   void                (*softkey_service_client_set)(E_Client *ec);
+   void                (*softkey_service_client_unset)(E_Client *ec);
+   void                (*softkey_service_show)(E_Service_Softkey *softkey);
+   void                (*softkey_service_hide)(E_Service_Softkey *softkey);
+   void                (*softkey_service_visible_set)(E_Service_Softkey *softkey, int visible);
+   int                 (*softkey_service_visible_get)(E_Service_Softkey *softkey);
+   void                (*softkey_service_expand_set)(E_Service_Softkey *softkey, E_Policy_Softkey_Expand expand);
+   Eina_Bool           (*softkey_service_expand_get)(E_Service_Softkey *softkey, E_Policy_Softkey_Expand *expand);
+   void                (*softkey_service_opacity_set)(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity opacity);
+   Eina_Bool           (*softkey_service_opacity_get)(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity *opacity);
+   E_Service_Softkey*  (*softkey_service_get)(E_Zone *zone);
+};
+
+
+E_API Eina_Bool           e_service_softkey_module_func_set(E_Service_Softkey_Funcs *fp);
+E_API Eina_Bool           e_service_softkey_module_func_unset(void);
+
+E_API E_Service_Softkey  *e_service_softkey_add(E_Zone *zone, E_Client *ec);
+E_API void                e_service_softkey_del(E_Service_Softkey *softkey);
+
+E_API Eina_Bool           e_service_softkey_wl_resource_set(E_Service_Softkey *softkey, struct wl_resource *wl_res);
+E_API struct wl_resource *e_service_softkey_wl_resource_get(E_Service_Softkey *softkey);
+
+EINTERN void              e_service_softkey_client_set(E_Client *ec);
+EINTERN void              e_service_softkey_client_unset(E_Client *ec);
+
+EINTERN void              e_service_softkey_show(E_Service_Softkey *softkey);
+EINTERN void              e_service_softkey_hide(E_Service_Softkey *softkey);
+
+EINTERN void              e_service_softkey_visible_set(E_Service_Softkey *softkey, int visible);
+EINTERN int               e_service_softkey_visible_get(E_Service_Softkey *softkey);
+EINTERN void              e_service_softkey_expand_set(E_Service_Softkey *softkey, E_Policy_Softkey_Expand expand);
+EINTERN Eina_Bool         e_service_softkey_expand_get(E_Service_Softkey *softkey, E_Policy_Softkey_Expand *expand);
+EINTERN void              e_service_softkey_opacity_set(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity opacity);
+EINTERN Eina_Bool         e_service_softkey_opacity_get(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity *opacity);
+
+E_API E_Service_Softkey  *e_service_softkey_get(E_Zone *zone);
+
+#endif