e_policy_wl: Support new tzsh_service_kvm protocol 24/296424/1
authorJunseok Kim <juns.kim@samsung.com>
Mon, 10 Jul 2023 07:36:46 +0000 (16:36 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 27 Jul 2023 07:15:32 +0000 (16:15 +0900)
Change-Id: I5fcd6885d95b14f18e446bdcc48b7ff058021927

src/bin/e_policy.c
src/bin/e_policy.h
src/bin/e_policy_wl.c

index 98d8bdb..694b365 100644 (file)
@@ -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)
 {
index 7f2cfa7..54f3f1b 100644 (file)
@@ -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);
 
index b902efb..7026d3d 100644 (file)
@@ -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);
 }