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

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


Relay the event to the IDropTarget at the current drag-and-drop
position.

Signed-off-by: default avatarAlexandros Frantzis <alexandros.frantzis@collabora.com>
parent 1a289544
No related branches found
No related tags found
No related merge requests found
......@@ -83,6 +83,7 @@ C_ASSERT(waylanddrv_client_func_last <= NtUserDriverCallbackLast + 1);
enum waylanddrv_client_dnd_event
{
CLIENT_DND_EVENT_ENTER,
CLIENT_DND_EVENT_LEAVE,
};
struct waylanddrv_client_dnd_params
......
......@@ -385,8 +385,30 @@ static void data_device_enter(void *data, struct wl_data_device *wl_data_device,
static void data_device_leave(void *data, struct wl_data_device *wl_data_device)
{
struct waylanddrv_client_dnd_params params;
struct wayland_data_device *data_device = data;
POINT point;
TRACE("surface=%p hwnd=%p\n",
data_device->dnd_surface,
data_device->dnd_surface ? data_device->dnd_surface->hwnd : 0);
if (!data_device->dnd_wl_data_offer || !data_device->dnd_surface)
goto out;
wayland_surface_coords_to_screen(data_device->dnd_surface,
data_device->dnd_x, data_device->dnd_y,
(int *)&point.x, (int *)&point.y);
params.event = CLIENT_DND_EVENT_LEAVE;
params.hwnd = HandleToULong(data_device->dnd_surface->hwnd);
params.point = point;
params.drop_effect = 0;
params.data_object = 0;
WAYLANDDRV_CLIENT_CALL(dnd, &params, sizeof(params));
out:
wayland_data_device_destroy_dnd_data_offer(data_device);
}
......
......@@ -213,6 +213,24 @@ static NTSTATUS WINAPI waylanddrv_client_dnd_enter(void *params, ULONG size)
return STATUS_SUCCESS;
}
static NTSTATUS WINAPI waylanddrv_client_dnd_leave(void *params, ULONG size)
{
struct waylanddrv_client_dnd_params *p = params;
IDropTarget *drop_target;
HRESULT hr;
drop_target = drop_target_from_window_point(ULongToHandle(p->hwnd), p->point);
if (!drop_target)
return STATUS_UNSUCCESSFUL;
hr = IDropTarget_DragLeave(drop_target);
IDropTarget_Release(drop_target);
if (FAILED(hr))
return STATUS_UNSUCCESSFUL;
return STATUS_SUCCESS;
}
NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size)
{
struct waylanddrv_client_dnd_params *p = params;
......@@ -220,6 +238,8 @@ NTSTATUS WINAPI waylanddrv_client_dnd(void *params, ULONG size)
switch (p->event) {
case CLIENT_DND_EVENT_ENTER:
return waylanddrv_client_dnd_enter(params, size);
case CLIENT_DND_EVENT_LEAVE:
return waylanddrv_client_dnd_leave(params, size);
}
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