From: Doyoun Kang Date: Tue, 10 Jul 2018 06:08:59 +0000 (+0900) Subject: support tzsh_softkey protocol X-Git-Tag: accepted/tizen/unified/20181128.144719~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F96%2F183696%2F3;p=platform%2Fupstream%2Fenlightenment.git support tzsh_softkey protocol Change-Id: I19dabded95beaacf5c34a172c10b047a3264b97a --- diff --git a/src/bin/e_policy.h b/src/bin/e_policy.h index ab6012c..b0b7001 100644 --- a/src/bin/e_policy.h +++ b/src/bin/e_policy.h @@ -11,6 +11,18 @@ typedef struct _E_Policy_Interceptor E_Policy_Interceptor; typedef struct _E_Policy_Hook E_Policy_Hook; typedef struct _E_Policy_Softkey_Funcs E_Policy_Softkey_Funcs; +typedef enum _E_Policy_Softkey_Expand +{ + E_POLICY_SOFTKEY_EXPAND_OFF, + E_POLICY_SOFTKEY_EXPAND_ON +} E_Policy_Softkey_Expand; + +typedef enum _E_Policy_Softkey_Opacity +{ + E_POLICY_SOFTKEY_OPACITY_OPAQUE, + E_POLICY_SOFTKEY_OPACITY_TRANSPARENT +} E_Policy_Softkey_Opacity; + typedef enum _E_Policy_Intercept_Point { E_POLICY_INTERCEPT_LAUNCHSCREEN_OBJECT_SETUP, @@ -98,6 +110,8 @@ struct _E_Policy_Softkey EINA_INLIST; E_Zone *zone; + E_Policy_Softkey_Expand expand; + E_Policy_Softkey_Opacity opacity; Evas_Object *home; Evas_Object *back; void *other; @@ -110,6 +124,11 @@ struct _E_Policy_Softkey_Funcs void (*softkey_show)(E_Policy_Softkey *softkey); void (*softkey_hide)(E_Policy_Softkey *softkey); void (*softkey_update)(E_Policy_Softkey *softkey); + int (*softkey_visible_get)(E_Policy_Softkey *softkey); + void (*softkey_expand_set)(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand expand); + Eina_Bool (*softkey_expand_get)(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand *expand); + void (*softkey_opacity_set)(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity opacity); + Eina_Bool (*softkey_opacity_get)(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity *opacity); }; struct _E_Policy @@ -179,6 +198,11 @@ E_API void e_policy_softkey_del(E_Policy_Softkey *softkey); E_API void e_policy_softkey_show(E_Policy_Softkey *softkey); E_API void e_policy_softkey_hide(E_Policy_Softkey *softkey); E_API void e_policy_softkey_update(E_Policy_Softkey *softkey); +E_API int e_policy_softkey_visible_get(E_Policy_Softkey *softkey); +E_API void e_policy_softkey_expand_set(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand expand); +E_API Eina_Bool e_policy_softkey_expand_get(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand *expand); +E_API void e_policy_softkey_opacity_set(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity opacity); +E_API Eina_Bool e_policy_softkey_opacity_get(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity *opacity); E_API E_Policy_Softkey *e_policy_softkey_get(E_Zone *zone); E_API Eina_Bool e_policy_softkey_module_func_set(E_Policy_Softkey_Funcs *fn); E_API void e_policy_softkey_module_func_unset(void); diff --git a/src/bin/e_policy_softkey.c b/src/bin/e_policy_softkey.c index 3b1ff4b..06e9d83 100644 --- a/src/bin/e_policy_softkey.c +++ b/src/bin/e_policy_softkey.c @@ -187,6 +187,86 @@ e_policy_softkey_update(E_Policy_Softkey *softkey) evas_object_geometry_set(softkey->back, x + space, y, ow, oh); } +int +e_policy_softkey_visible_get(E_Policy_Softkey *softkey) +{ + int visible; + + if (_e_softkey_funcs && _e_softkey_funcs->softkey_visible_get) + return _e_softkey_funcs->softkey_visible_get(softkey); + + if (!softkey) return 0; + + visible = evas_object_visible_get(softkey->home); + return visible; +} + +void +e_policy_softkey_expand_set(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand expand) +{ + if (_e_softkey_funcs && _e_softkey_funcs->softkey_expand_set) + return _e_softkey_funcs->softkey_expand_set(softkey, expand); + + if (!softkey) return; + + softkey->expand = expand; +} + +Eina_Bool +e_policy_softkey_expand_get(E_Policy_Softkey *softkey, E_Policy_Softkey_Expand *expand) +{ + if (_e_softkey_funcs && _e_softkey_funcs->softkey_expand_get) + return _e_softkey_funcs->softkey_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; + } +} + +void +e_policy_softkey_opacity_set(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity opacity) +{ + if (_e_softkey_funcs && _e_softkey_funcs->softkey_opacity_set) + return _e_softkey_funcs->softkey_opacity_set(softkey, opacity); + + if (!softkey) return; + + softkey->opacity = opacity; +} + +Eina_Bool +e_policy_softkey_opacity_get(E_Policy_Softkey *softkey, E_Policy_Softkey_Opacity *opacity) +{ + if (_e_softkey_funcs && _e_softkey_funcs->softkey_opacity_get) + return _e_softkey_funcs->softkey_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_Policy_Softkey * e_policy_softkey_get(E_Zone *zone) { @@ -216,6 +296,11 @@ e_policy_softkey_module_func_set(E_Policy_Softkey_Funcs *fp) _e_softkey_funcs->softkey_show = fp->softkey_show; _e_softkey_funcs->softkey_hide = fp->softkey_hide; _e_softkey_funcs->softkey_update = fp->softkey_update; + _e_softkey_funcs->softkey_visible_get = fp->softkey_visible_get; + _e_softkey_funcs->softkey_expand_set = fp->softkey_expand_set; + _e_softkey_funcs->softkey_expand_get = fp->softkey_expand_get; + _e_softkey_funcs->softkey_opacity_set = fp->softkey_opacity_set; + _e_softkey_funcs->softkey_opacity_get = fp->softkey_opacity_get; return EINA_TRUE; } diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index 1fefa1e..03ee925 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -4728,6 +4728,299 @@ static void _tzsh_iface_cb_extension_get(struct wl_client *client, struct wl_res } // -------------------------------------------------------- +// tizen_ws_shell_interface::softkey +// -------------------------------------------------------- +static void +_tzsh_softkey_iface_cb_release(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey) +{ + wl_resource_destroy(res_tzsh_softkey); +} + +static void +_tzsh_softkey_iface_cb_support_check(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey) +{ + E_Policy_Wl_Tzsh_Client *tzsh_client; + int support; + + ELOGF("TZ_SOFTKEY", "Request to Check supporting softkey", NULL, NULL); + + 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); + + if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client)) + return; + + if (e_config->use_softkey) + support = 1; + else + support = 0; + + ELOGF("TZ_SOFTKEY", "Send SUPPORT_CHECK_DONE. support:%d", NULL, NULL, support); + tws_softkey_send_support_check_done(res_tzsh_softkey, support); +} + +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; + + 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); + + if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client)) + return; + + softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone); + if (softkey) + { + ELOGF("TZ_SOFTKEY", "SHOW softkey", NULL, NULL); + e_policy_softkey_show(softkey); + } +} + +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; + + 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); + + if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client)) + return; + + softkey = e_policy_softkey_get(tzsh_client->tzsh->ec->zone); + if (softkey) + { + ELOGF("TZ_SOFTKEY", "HIDE softkey", NULL, NULL); + e_policy_softkey_hide(softkey); + } +} + +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; + + 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); + + 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) + { + 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; + } +} + +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; + int visible; + int val; + + ELOGF("TZ_SOFTKEY", "Request to Get state (tz_type:%d)", NULL, NULL, type); + + if (!e_config->use_softkey) return; + + 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); + + 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) + { + 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; + } +} + +static const struct tws_softkey_interface _tzsh_softkey_iface = +{ + _tzsh_softkey_iface_cb_release, + _tzsh_softkey_iface_cb_support_check, + _tzsh_softkey_iface_cb_show, + _tzsh_softkey_iface_cb_hide, + _tzsh_softkey_iface_cb_state_set, + _tzsh_softkey_iface_cb_state_get +}; + +static void +_tzsh_cb_softkey_destroy(struct wl_resource *res_tzsh_softkey) +{ + E_Policy_Wl_Tzsh_Client *tzsh_client; + + tzsh_client = wl_resource_get_user_data(res_tzsh_softkey); + EINA_SAFETY_ON_NULL_RETURN(tzsh_client); + + _e_policy_wl_tzsh_client_del(tzsh_client); +} + + +static void +_tzsh_iface_cb_softkey_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_softkey; + E_Client *ec; + E_Pixmap *cp; + + 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_softkey = wl_resource_create(client, + &tws_softkey_interface, + wl_resource_get_version(res_tzsh), + id); + if (!res_tzsh_softkey) + { + ERR("Could not create tws_quickpanel 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_softkey); + if (!tzsh_client) + { + ERR("Could not create tzsh_client"); + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(res_tzsh_softkey, + &_tzsh_softkey_iface, + tzsh_client, + _tzsh_cb_softkey_destroy); +} + + +// -------------------------------------------------------- // tizen_ws_shell_interface // -------------------------------------------------------- static void @@ -4744,6 +5037,7 @@ static const struct tizen_ws_shell_interface _tzsh_iface = _tzsh_iface_cb_qp_get, _tzsh_iface_cb_tvsrv_get, _tzsh_iface_cb_extension_get, + _tzsh_iface_cb_softkey_get, }; static void