e_service_kvm: Add ane implements new APIs for kvm service 11/297911/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 9 Aug 2023 03:00:10 +0000 (12:00 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 28 Aug 2023 10:33:53 +0000 (19:33 +0900)
Add new APIs
- cancel_drag: cancel current drag without data sharing
- force_drag_enter: force enter the drag into the kvm service window
- force_drag_leave: force leave the drag from the kvm service window
- receive_drag_data: receive drag data during keep dragging

Change-Id: Ib1857dbbff93282db5865fd886ab59a7957c52bd

src/bin/e_policy_wl.c
src/bin/services/e_service_kvm.c
src/bin/services/e_service_kvm.h

index 7149756..2a149f1 100644 (file)
@@ -4574,6 +4574,57 @@ _tzsh_srv_kvm_cb_perform_drop(struct wl_client *client EINA_UNUSED, struct wl_re
 }
 
 static void
+_tzsh_srv_kvm_cb_cancel_drag(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_drag_cancel(ec);
+}
+
+static void
+_tzsh_srv_kvm_cb_perform_drag_enter(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_perform_drag_enter(ec);
+}
+
+static void
+_tzsh_srv_kvm_cb_perform_drag_leave(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_perform_drag_leave(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;
@@ -4607,6 +4658,9 @@ 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_cancel_drag,
+   _tzsh_srv_kvm_cb_perform_drag_enter,
+   _tzsh_srv_kvm_cb_perform_drag_leave,
    _tzsh_srv_kvm_cb_secondary_selection_set,
    _tzsh_srv_kvm_cb_secondary_selection_unset,
 };
index 4e86d00..810ff6d 100644 (file)
@@ -11,6 +11,7 @@ struct _E_Service_Kvm
    struct wl_resource *srv_kvm_res;
 
    Eina_Bool perform_requested;
+   Eina_Bool force_entered;
 };
 
 /* private data for kvm */
@@ -19,6 +20,11 @@ static E_Service_Kvm *_kvm_service = NULL;
 /* event handler */
 static E_Client_Hook *_kvm_del_hook = NULL;
 static Eina_List     *_kvm_drag_hook_list = NULL;
+static Eina_List     *_kvm_ecore_event_handlers = NULL;
+
+
+static void _e_service_kvm_send_client_enter(E_Client *ec);
+static void _e_service_kvm_send_client_leave(E_Client *ec);
 
 static void
 _kvm_client_del(void)
@@ -29,6 +35,7 @@ _kvm_client_del(void)
          e_drag_hook_del(drag_hook);
      }
    E_FREE_FUNC(_kvm_del_hook, e_client_hook_del);
+   E_FREE_LIST(_kvm_ecore_event_handlers, ecore_event_handler_del);
    E_FREE(_kvm_service);
 
    e_comp_wl->selection.secondary = NULL;
@@ -62,6 +69,8 @@ _kvm_hook_drag_end(void *d EINA_UNUSED, E_Drag *drag)
    if (!_kvm_service) return;
 
    e_service_kvm_send_drag_end();
+   if (_kvm_service->force_entered)
+     _e_service_kvm_send_client_leave(_kvm_service->ec);
 }
 
 EINTERN Eina_Bool
@@ -194,6 +203,65 @@ e_service_kvm_drop_perform(E_Client *ec)
 }
 
 EINTERN Eina_Bool
+e_service_kvm_drag_cancel(E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_kvm_service, EINA_FALSE);
+
+   if (ec != _kvm_service->ec)
+     {
+        ELOGF("KVM", "ERROR... kvm service ec is not matched. regisered(%p)", ec, _kvm_service->ec);
+        return EINA_FALSE;
+     }
+
+   ELOGF("KVM", "Cancel drag by kvm_service request!", ec);
+
+   e_drag_end(e_comp_wl->drag);
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_service_kvm_perform_drag_enter(E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_kvm_service, EINA_FALSE);
+
+   if (ec != _kvm_service->ec)
+     {
+        ELOGF("KVM", "ERROR... kvm service ec is not matched. regisered(%p)", ec, _kvm_service->ec);
+        return EINA_FALSE;
+     }
+
+   ELOGF("KVM", "Send force drag enter by kvm_service request!", ec);
+
+   _e_service_kvm_send_client_enter(_kvm_service->ec);
+   _kvm_service->force_entered = EINA_TRUE;
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_service_kvm_perform_drag_leave(E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_kvm_service, EINA_FALSE);
+
+   if (ec != _kvm_service->ec)
+     {
+        ELOGF("KVM", "ERROR... kvm service ec is not matched. regisered(%p)", ec, _kvm_service->ec);
+        return EINA_FALSE;
+     }
+
+   ELOGF("KVM", "Send force drag leave by kvm_service request!", ec);
+
+   _e_service_kvm_send_client_leave(_kvm_service->ec);
+   _kvm_service->force_entered = EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
 e_service_kvm_secondary_selection_set(E_Client *ec, Eina_Bool set)
 {
    E_Comp_Wl_Client_Data *cdata;
@@ -224,3 +292,43 @@ e_service_kvm_secondary_selection_set(E_Client *ec, Eina_Bool set)
 
    return EINA_TRUE;
 }
+
+static void
+_e_service_kvm_send_client_enter(E_Client *ec)
+{
+   struct wl_resource *data_device_res, *offer_res;
+   struct wl_resource *surface;
+   uint32_t serial;
+   int x, y;
+
+   if (!e_comp_wl->drag_source) return;
+   if (e_comp_wl->selection.target == ec) return;
+
+   surface = e_comp_wl_client_surface_get(ec);
+   if (!surface) return;
+
+   data_device_res = e_comp_wl_data_find_for_client(wl_resource_get_client(surface));
+   if (!data_device_res) return;
+
+   offer_res = e_comp_wl_data_device_send_offer(ec);
+   if (!offer_res) return;
+
+   x = wl_fixed_to_int(e_comp_wl->ptr.x) - ec->client.x;
+   y = wl_fixed_to_int(e_comp_wl->ptr.y) - ec->client.y;
+   serial = wl_display_next_serial(e_comp_wl->wl.disp);
+   wl_data_device_send_enter(data_device_res, serial, surface,
+                             wl_fixed_from_int(x), wl_fixed_from_int(y), offer_res);
+}
+
+static void
+_e_service_kvm_send_client_leave(E_Client *ec)
+{
+   struct wl_resource *surface, *res;
+
+   surface = e_comp_wl_client_surface_get(ec);
+   if (!surface) return;
+
+   res = e_comp_wl_data_find_for_client(wl_resource_get_client(surface));
+   if (res)
+     wl_data_device_send_leave(res);
+}
index 90db81e..47a123c 100644 (file)
@@ -14,7 +14,11 @@ EINTERN void           e_service_kvm_wl_resource_set(E_Service_Kvm *service, str
 EINTERN Eina_Bool      e_service_kvm_send_drag_start(void);
 EINTERN Eina_Bool      e_service_kvm_send_drag_end(void);
 
+
 EINTERN Eina_Bool      e_service_kvm_drop_perform(E_Client *ec);
+EINTERN Eina_Bool      e_service_kvm_drag_cancel(E_Client *ec);
+EINTERN Eina_Bool      e_service_kvm_perform_drag_enter(E_Client *ec);
+EINTERN Eina_Bool      e_service_kvm_perform_drag_leave(E_Client *ec);
 EINTERN Eina_Bool      e_service_kvm_secondary_selection_set(E_Client *ec, Eina_Bool set);
 
 #endif /* E_SERVICE_KVM_H */