From 6c63dd3a599898bcd32683a545cc52ecca0b50fd Mon Sep 17 00:00:00 2001 From: Junseok Kim Date: Mon, 10 Jul 2023 16:36:46 +0900 Subject: [PATCH] e_policy_wl: Support new tzsh_service_kvm protocol Change-Id: I5fcd6885d95b14f18e446bdcc48b7ff058021927 --- src/bin/e_policy.c | 11 +++++ src/bin/e_policy.h | 1 + src/bin/e_policy_wl.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) diff --git a/src/bin/e_policy.c b/src/bin/e_policy.c index 98d8bdb..694b365 100644 --- a/src/bin/e_policy.c +++ b/src/bin/e_policy.c @@ -1921,6 +1921,17 @@ e_policy_client_is_taskbar(E_Client *ec) return EINA_FALSE; } +EINTERN Eina_Bool +e_policy_client_is_KVM(E_Client *ec) +{ + E_OBJECT_CHECK_RETURN(ec, EINA_FALSE); + + if (!e_util_strcmp(ec->icccm.window_role, "KVM")) + return EINA_TRUE; + + return EINA_FALSE; +} + E_API E_Service_Quickpanel_Type e_policy_quickpanel_type_get(E_Client *ec) { diff --git a/src/bin/e_policy.h b/src/bin/e_policy.h index 7f2cfa7..54f3f1b 100644 --- a/src/bin/e_policy.h +++ b/src/bin/e_policy.h @@ -230,6 +230,7 @@ E_API Eina_Bool e_policy_client_is_keyboard_sub(E_Client *ec); E_API Eina_Bool e_policy_client_is_keyboard_magnifier(E_Client *ec); EINTERN Eina_Bool e_policy_client_is_watch_viewer(E_Client *ec); EINTERN Eina_Bool e_policy_client_is_taskbar(E_Client *ec); +EINTERN Eina_Bool e_policy_client_is_kvm(E_Client *ec); E_API E_Service_Quickpanel_Type e_policy_quickpanel_type_get(E_Client *ec); diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index b902efb..7026d3d 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -9,6 +9,7 @@ #include "services/e_service_softkey.h" #include "services/e_service_launcher.h" #include "services/e_service_taskbar.h" +#include "services/e_service_kvm.h" #include "e_policy_wl_display.h" #include "e_policy_conformant_internal.h" #include "e_policy_visibility.h" @@ -36,6 +37,7 @@ typedef enum _Tzsh_Srv_Role TZSH_SRV_ROLE_MAGNIFIER, TZSH_SRV_ROLE_LAUNCHER, TZSH_SRV_ROLE_TASKBAR, + TZSH_SRV_ROLE_KVM, TZSH_SRV_ROLE_MAX } Tzsh_Srv_Role; @@ -789,6 +791,7 @@ _e_policy_wl_tzsh_srv_role_get(const char *name) else if (!e_util_strcmp(name, "magnifier" )) role = TZSH_SRV_ROLE_MAGNIFIER; else if (!e_util_strcmp(name, "launcher" )) role = TZSH_SRV_ROLE_LAUNCHER; else if (!e_util_strcmp(name, "taskbar" )) role = TZSH_SRV_ROLE_TASKBAR; + else if (!e_util_strcmp(name, "KVM" )) role = TZSH_SRV_ROLE_KVM; return role; } @@ -4524,6 +4527,107 @@ _tzsh_srv_iface_cb_taskbar_get(struct wl_client *client, struct wl_resource *res wl_resource_set_implementation(res, &_tzsh_srv_taskbar_iface, tzsh_srv, NULL); } +static void +_tzsh_srv_kvm_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static void +_tzsh_srv_kvm_cb_perform_drop(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(resource); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + + ec = tzsh_srv->ec; + EINA_SAFETY_ON_NULL_RETURN(ec); + + if (!e_comp_wl->drag) return; + + e_service_kvm_drop_perform(ec); +} + +static void +_tzsh_srv_kvm_cb_secondary_selection_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(resource); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + + ec = tzsh_srv->ec; + EINA_SAFETY_ON_NULL_RETURN(ec); + + e_service_kvm_secondary_selection_set(ec, EINA_TRUE); +} + +static void +_tzsh_srv_kvm_cb_secondary_selection_unset(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(resource); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + + ec = tzsh_srv->ec; + EINA_SAFETY_ON_NULL_RETURN(ec); + + e_service_kvm_secondary_selection_set(ec, EINA_FALSE); +} + +static const struct tws_service_kvm_interface _tzsh_srv_kvm_iface = +{ + _tzsh_srv_kvm_cb_destroy, + _tzsh_srv_kvm_cb_perform_drop, + _tzsh_srv_kvm_cb_secondary_selection_set, + _tzsh_srv_kvm_cb_secondary_selection_unset, +}; + +static void +_tzsh_srv_iface_cb_kvm_get(struct wl_client *client, struct wl_resource *res_tzsh_srv, uint32_t id) +{ + E_Service_Kvm *service = NULL; + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + struct wl_resource *res; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(res_tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh); + + if (!eina_list_data_find(polwl->tzsh_srvs, tzsh_srv)) + return; + + res = wl_resource_create(client, + &tws_service_kvm_interface, + 1, + id); + if (!res) + { + wl_client_post_no_memory(client); + return; + } + + ELOGF("KVM", "multi control resource created, res:%p, tzsh_srv:%p, res_tzsh_srv:%p", NULL, res, tzsh_srv, res_tzsh_srv); + + ec = tzsh_srv->ec; + if (ec) + service = e_service_kvm_get(); + + if (service) + { + ELOGF("KVM", "multi control resource set. res:%p, service:%p, ec:%p", NULL, res, service, ec); + e_service_kvm_wl_resource_set(service, res); + } + + wl_resource_set_implementation(res, &_tzsh_srv_kvm_iface, tzsh_srv, NULL); +} + static const struct tws_service_interface _tzsh_srv_iface = { _tzsh_srv_iface_cb_destroy, @@ -4537,6 +4641,7 @@ static const struct tws_service_interface _tzsh_srv_iface = _tzsh_srv_iface_cb_magnifier_get, _tzsh_srv_iface_cb_launcher_get, _tzsh_srv_iface_cb_taskbar_get, + _tzsh_srv_iface_cb_kvm_get, }; static Eina_Bool @@ -4582,6 +4687,11 @@ _e_policy_wl_tzsh_service_check_privilege(struct wl_client *client, int role) case TZSH_SRV_ROLE_TASKBAR: privilege = E_PRIVILEGE_TASKBAR_SERVICE; break; + /* TODO: need to check privilege + case TZSH_SRV_ROLE_KVM: + privilege = E_PRIVILEGE_KVM_SERVICE; + break; + */ default: return EINA_TRUE; } @@ -4754,6 +4864,8 @@ _tzsh_iface_cb_srv_create(struct wl_client *client, struct wl_resource *res_tzsh e_service_launcher_client_set(tzsh_srv->ec); else if (role == TZSH_SRV_ROLE_TASKBAR) e_service_taskbar_client_set(tzsh_srv->ec); + else if (role == TZSH_SRV_ROLE_KVM) + e_service_kvm_client_set(tzsh_srv->ec); e_client_desk_iconify_skip_set(tzsh_srv->ec, EINA_TRUE); } -- 2.7.4