Skip to content
Snippets Groups Projects
Commit 5b708b62 authored by Alexandros Frantzis's avatar Alexandros Frantzis
Browse files

winewayland.drv: Handle the wl_data_device::drop event.


Relay the event to the IDropTarget at the current drag-and-drop position,
which will then initiate a data transfer by using the IDataObject_GetData
implementation for the associated Wayland data offer.

Signed-off-by: default avatarAlexandros Frantzis <alexandros.frantzis@collabora.com>
parent c544b7d2
No related branches found
No related tags found
No related merge requests found
...@@ -85,6 +85,7 @@ enum waylanddrv_client_dnd_event ...@@ -85,6 +85,7 @@ enum waylanddrv_client_dnd_event
CLIENT_DND_EVENT_ENTER, CLIENT_DND_EVENT_ENTER,
CLIENT_DND_EVENT_LEAVE, CLIENT_DND_EVENT_LEAVE,
CLIENT_DND_EVENT_MOTION, CLIENT_DND_EVENT_MOTION,
CLIENT_DND_EVENT_DROP,
}; };
struct waylanddrv_client_dnd_params struct waylanddrv_client_dnd_params
......
...@@ -455,8 +455,34 @@ static void data_device_motion(void *data, struct wl_data_device *wl_data_device ...@@ -455,8 +455,34 @@ static void data_device_motion(void *data, struct wl_data_device *wl_data_device
static void data_device_drop(void *data, struct wl_data_device *wl_data_device) static void data_device_drop(void *data, struct wl_data_device *wl_data_device)
{ {
struct waylanddrv_client_dnd_params params;
struct wayland_data_device *data_device = data; struct wayland_data_device *data_device = data;
struct wayland_data_offer *data_offer;
POINT point;
if (!data_device->dnd_wl_data_offer || !data_device->dnd_surface)
goto out;
data_offer = wl_data_offer_get_user_data(data_device->dnd_wl_data_offer);
wayland_surface_coords_to_screen(data_device->dnd_surface,
data_device->dnd_x, data_device->dnd_y,
(int *)&point.x, (int *)&point.y);
TRACE("surface=%p hwnd=%p source_actions=%x action=%x\n",
data_device->dnd_surface, data_device->dnd_surface->hwnd,
data_offer->source_actions, data_offer->action);
params.event = CLIENT_DND_EVENT_DROP;
params.hwnd = HandleToULong(data_device->dnd_surface->hwnd);
params.point = point;
params.drop_effect = dnd_actions_to_drop_effect(data_offer->source_actions);
params.data_object = PtrToUint(data_offer);
if (WAYLANDDRV_CLIENT_CALL(dnd, &params, sizeof(params)) == 0)
wl_data_offer_finish(data_device->dnd_wl_data_offer);
out:
wayland_data_device_destroy_dnd_data_offer(data_device); wayland_data_device_destroy_dnd_data_offer(data_device);
} }
......
...@@ -251,6 +251,27 @@ static NTSTATUS WINAPI waylanddrv_client_dnd_motion(void *params, ULONG size) ...@@ -251,6 +251,27 @@ static NTSTATUS WINAPI waylanddrv_client_dnd_motion(void *params, ULONG size)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS WINAPI waylanddrv_client_dnd_drop(void *params, ULONG size)
{
struct waylanddrv_client_dnd_params *p = params;
IDropTarget *drop_target;
DWORD drop_effect = p->drop_effect;
IDataObject *data_object = UIntToPtr(p->data_object);
HRESULT hr;
drop_target = drop_target_from_window_point(ULongToHandle(p->hwnd), p->point);
if (drop_target)
{
hr = IDropTarget_Drop(drop_target, data_object, MK_LBUTTON,
*(POINTL*)&p->point, &drop_effect);
IDropTarget_Release(drop_target);
if (SUCCEEDED(hr) && drop_effect != DROPEFFECT_NONE)
return STATUS_SUCCESS;
}
return STATUS_UNSUCCESSFUL;
}
NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size) NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size)
{ {
struct waylanddrv_client_dnd_params *p = params; struct waylanddrv_client_dnd_params *p = params;
...@@ -262,6 +283,8 @@ NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size) ...@@ -262,6 +283,8 @@ NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size)
return waylanddrv_client_dnd_leave(params, size); return waylanddrv_client_dnd_leave(params, size);
case CLIENT_DND_EVENT_MOTION: case CLIENT_DND_EVENT_MOTION:
return waylanddrv_client_dnd_motion(params, size); return waylanddrv_client_dnd_motion(params, size);
case CLIENT_DND_EVENT_DROP:
return waylanddrv_client_dnd_drop(params, size);
} }
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment