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,
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 */
};
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);
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);
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)
{
}
}
}
+ else
+ {
+ if (_e_policy_wl_tzsh_client_get_from_tzsh(tzsh))
+ _e_policy_wl_tzsh_srv_tvsrv_bind_update();
+ }
}
// --------------------------------------------------------
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;
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);
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;
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)
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))
_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;
_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,