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

winewayland.drv: Implement IDataObject::QueryGetData for data offers.


Check if for any of the available mime types of the associated data
offer we support converting from that mime type to the requested Windows
clipboard format.

Signed-off-by: default avatarAlexandros Frantzis <alexandros.frantzis@collabora.com>
parent f56b7d1a
No related branches found
No related tags found
No related merge requests found
......@@ -23,11 +23,16 @@
#include "ntuser.h"
#include "wine/unixlib.h"
/* A pointer to memory that is guaranteed to be usable by both 32-bit and
* 64-bit processes. */
typedef UINT PTR32;
enum waylanddrv_unix_func
{
waylanddrv_unix_func_init,
waylanddrv_unix_func_read_events,
waylanddrv_unix_func_clipboard_message,
waylanddrv_unix_func_data_offer_accept_format,
waylanddrv_unix_func_count,
};
......@@ -39,6 +44,12 @@ struct waylanddrv_unix_clipboard_message_params
LPARAM lparam;
};
struct waylanddrv_unix_data_offer_accept_format_params
{
PTR32 data_offer;
UINT format;
};
/* driver client callbacks exposed with KernelCallbackTable interface */
enum waylanddrv_client_func
{
......
......@@ -24,6 +24,10 @@
#include "config.h"
#include "ntstatus.h"
#define WIN32_NO_STATUS
#define NONAMELESSUNION
#include "waylanddrv.h"
#include "wine/debug.h"
......@@ -49,6 +53,7 @@ struct wayland_data_offer
struct wl_array types;
uint32_t source_actions;
uint32_t action;
const char *accepted_mime_type;
};
/* Normalize the mime type by skipping inconsequential characters, such as
......@@ -689,3 +694,24 @@ void wayland_data_device_ensure_clipboard_window(struct wayland *wayland)
ULongToHandle(WAYLANDDRV_CLIENT_CALL(create_clipboard_window, NULL, 0));
}
}
NTSTATUS waylanddrv_unix_data_offer_accept_format(void *arg)
{
struct waylanddrv_unix_data_offer_accept_format_params *p = arg;
struct wayland_data_offer *data_offer = UIntToPtr(p->data_offer);
struct wayland_data_device_format *format;
TRACE("data_offer=%p clipboard_format=%d\n", data_offer, p->format);
format = wayland_data_device_format_for_clipboard_format(p->format,
&data_offer->types);
if (format)
{
TRACE("found offer %s for clipboard format %u\n",
format->mime_type, format->clipboard_format);
data_offer->accepted_mime_type = format->mime_type;
return STATUS_SUCCESS;
}
return STATUS_UNSUCCESSFUL;
}
......@@ -137,10 +137,25 @@ static HRESULT WINAPI dataOfferDataObject_GetDataHere(IDataObject *data_object,
static HRESULT WINAPI dataOfferDataObject_QueryGetData(IDataObject *data_object,
FORMATETC *format_etc)
{
struct waylanddrv_unix_data_offer_accept_format_params params;
TRACE("(%p, %p={.tymed=0x%lx, .dwAspect=%ld, .cfFormat=%d}\n",
data_object, format_etc, format_etc->tymed, format_etc->dwAspect,
format_etc->cfFormat);
if (format_etc->tymed && !(format_etc->tymed & TYMED_HGLOBAL))
{
FIXME("only HGLOBAL medium types supported right now\n");
return DV_E_TYMED;
}
params.data_offer = PtrToUint(data_object);
params.format = format_etc->cfFormat;
if (WAYLANDDRV_UNIX_CALL(data_offer_accept_format, &params) == 0)
return S_OK;
TRACE("didn't find offer for clipboard format %u\n", format_etc->cfFormat);
return DV_E_FORMATETC;
}
......
......@@ -824,6 +824,7 @@ static inline HWND get_focus(void)
NTSTATUS waylanddrv_client_call(enum waylanddrv_client_func func, const void *params,
ULONG size) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_clipboard_message(void *arg) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_data_offer_accept_format(void *arg) DECLSPEC_HIDDEN;
/**********************************************************************
* USER driver functions
......
......@@ -226,6 +226,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
waylanddrv_unix_init,
waylanddrv_unix_read_events,
waylanddrv_unix_clipboard_message,
waylanddrv_unix_data_offer_accept_format,
};
C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == waylanddrv_unix_func_count);
......@@ -254,6 +255,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
waylanddrv_unix_init,
waylanddrv_unix_read_events,
waylanddrv_unix_clipboard_message_wow64,
waylanddrv_unix_data_offer_accept_format,
};
C_ASSERT(ARRAYSIZE(__wine_unix_call_wow64_funcs) == waylanddrv_unix_func_count);
......
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