From: JunSeok Kim Date: Mon, 11 May 2020 08:02:18 +0000 (+0000) Subject: Revert "e_policy_wl: remove unused tzsh_tvsrv" X-Git-Tag: submit/tizen/20200511.084646~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d629ffb76714e4fdb41103ef275ff071fcdacab7;p=platform%2Fupstream%2Fenlightenment.git Revert "e_policy_wl: remove unused tzsh_tvsrv" This reverts commit 2a4fa3ad20028940fefe2c76aba0c6cd339c303e. Reason for revert: build break Change-Id: I739fc8cbb7c3c38e74e7fd7d81eeb3842182430a --- diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index 3c513553db..2112aa41a6 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -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,