}
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;
{
_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,
};
struct wl_resource *srv_kvm_res;
Eina_Bool perform_requested;
+ Eina_Bool force_entered;
};
/* private data for kvm */
/* 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)
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;
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
}
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;
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);
+}