#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"
TZSH_SRV_ROLE_SCREENSAVER_MNG,
TZSH_SRV_ROLE_SCREENSAVER,
TZSH_SRV_ROLE_CBHM,
+ TZSH_SRV_ROLE_SOFTKEY,
TZSH_SRV_ROLE_MAX
} Tzsh_Srv_Role;
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
{
_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);
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;
}
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)
_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
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);
}
// --------------------------------------------------------
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;
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);
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);
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);
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;
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);
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;
+ }
}
}
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);
--- /dev/null
+#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;
+}