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

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


For each mime type of the associated data offer we provid a FORMATETC
entry with the matching Windows clipboard format. We ensure that there
are no duplicate FORMATETC entries.

Signed-off-by: default avatarAlexandros Frantzis <alexandros.frantzis@collabora.com>
parent 10716902
No related branches found
No related tags found
No related merge requests found
MODULE = winewayland.drv
UNIXLIB = winewayland.so
IMPORTS = user32 uuid
DELAYIMPORTS = shell32
UNIX_CFLAGS = $(WAYLAND_CLIENT_CFLAGS) $(WAYLAND_CURSOR_CFLAGS) $(XKBCOMMON_CFLAGS) \
$(GBM_CFLAGS) $(UDEV_CFLAGS) $(DRM_CFLAGS)
UNIX_LIBS = -lwin32u -lm $(WAYLAND_CLIENT_LIBS) $(WAYLAND_CURSOR_LIBS) \
......
......@@ -34,6 +34,7 @@ enum waylanddrv_unix_func
waylanddrv_unix_func_clipboard_message,
waylanddrv_unix_func_data_offer_accept_format,
waylanddrv_unix_func_data_offer_import_format,
waylanddrv_unix_func_data_offer_enum_formats,
waylanddrv_unix_func_count,
};
......@@ -59,6 +60,13 @@ struct waylanddrv_unix_data_offer_import_format_params
UINT size;
};
struct waylanddrv_unix_data_offer_enum_formats_params
{
PTR32 data_offer;
UINT *formats;
UINT num_formats;
};
/* driver client callbacks exposed with KernelCallbackTable interface */
enum waylanddrv_client_func
{
......
......@@ -716,6 +716,30 @@ NTSTATUS waylanddrv_unix_data_offer_accept_format(void *arg)
return STATUS_UNSUCCESSFUL;
}
NTSTATUS waylanddrv_unix_data_offer_enum_formats(void *arg)
{
struct waylanddrv_unix_data_offer_enum_formats_params *p = arg;
struct wayland_data_offer *data_offer = UIntToPtr(p->data_offer);
char **mime;
UINT count = 0;
wl_array_for_each(mime, &data_offer->types)
{
struct wayland_data_device_format *format =
wayland_data_device_format_for_mime_type(*mime);
if (format)
{
if (p->formats && count < p->num_formats)
p->formats[count] = format->clipboard_format;
count++;
}
}
p->num_formats = count;
return STATUS_SUCCESS;
}
NTSTATUS waylanddrv_unix_data_offer_import_format(void *arg)
{
struct waylanddrv_unix_data_offer_import_format_params *p = arg;
......
......@@ -22,6 +22,7 @@
#define COBJMACROS
#include "objidl.h"
#include "shlobj.h"
#include "wine/debug.h"
......@@ -206,12 +207,75 @@ static HRESULT WINAPI dataOfferDataObject_SetData(IDataObject *data_object,
return E_NOTIMPL;
}
static BOOL formats_etc_contains_clipboard_format(FORMATETC *formats_etc,
size_t formats_etc_count,
UINT clipboard_format)
{
size_t i;
for (i = 0; i < formats_etc_count; i++)
if (formats_etc[i].cfFormat == clipboard_format) return TRUE;
return FALSE;
}
static HRESULT WINAPI dataOfferDataObject_EnumFormatEtc(IDataObject *data_object,
DWORD direction,
IEnumFORMATETC **enum_format_etc)
{
HRESULT hr;
FORMATETC *formats_etc;
size_t formats_etc_count = 0;
struct waylanddrv_unix_data_offer_enum_formats_params params;
TRACE("(%p, %lu, %p)\n", data_object, direction, enum_format_etc);
return E_NOTIMPL;
if (direction != DATADIR_GET)
{
FIXME("only the get direction is implemented\n");
return E_NOTIMPL;
}
params.data_offer = PtrToUint(data_object);
params.formats = NULL;
params.num_formats = 0;
WAYLANDDRV_UNIX_CALL(data_offer_enum_formats, &params);
params.formats = HeapAlloc(GetProcessHeap(), 0, params.num_formats * sizeof(UINT));
WAYLANDDRV_UNIX_CALL(data_offer_enum_formats, &params);
if (!params.formats)
return E_OUTOFMEMORY;
/* Allocate space for all offered mime types, although we may not use them all */
formats_etc = HeapAlloc(GetProcessHeap(), 0, params.num_formats * sizeof(FORMATETC));
if (!formats_etc)
{
HeapFree(GetProcessHeap(), 0, params.formats);
return E_OUTOFMEMORY;
}
for (int i = 0; i < params.num_formats; i++)
{
if (!formats_etc_contains_clipboard_format(formats_etc, formats_etc_count,
params.formats[i]))
{
FORMATETC *current= &formats_etc[formats_etc_count];
current->cfFormat = params.formats[i];
current->ptd = NULL;
current->dwAspect = DVASPECT_CONTENT;
current->lindex = -1;
current->tymed = TYMED_HGLOBAL;
formats_etc_count += 1;
}
}
hr = SHCreateStdEnumFmtEtc(formats_etc_count, formats_etc, enum_format_etc);
HeapFree(GetProcessHeap(), 0, params.formats);
HeapFree(GetProcessHeap(), 0, formats_etc);
return hr;
}
static HRESULT WINAPI dataOfferDataObject_DAdvise(IDataObject *data_object,
......
......@@ -825,6 +825,7 @@ NTSTATUS waylanddrv_client_call(enum waylanddrv_client_func func, const void *pa
ULONG size) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_clipboard_message(void *arg) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_data_offer_accept_format(void *arg) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_data_offer_enum_formats(void *arg) DECLSPEC_HIDDEN;
NTSTATUS waylanddrv_unix_data_offer_import_format(void *arg) DECLSPEC_HIDDEN;
/**********************************************************************
......
......@@ -228,6 +228,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
waylanddrv_unix_clipboard_message,
waylanddrv_unix_data_offer_accept_format,
waylanddrv_unix_data_offer_import_format,
waylanddrv_unix_data_offer_enum_formats,
};
C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == waylanddrv_unix_func_count);
......@@ -251,6 +252,21 @@ static NTSTATUS waylanddrv_unix_clipboard_message_wow64(void *arg)
return waylanddrv_unix_clipboard_message(&params);
}
static NTSTATUS waylanddrv_unix_data_offer_enum_formats_wow64(void *arg)
{
struct {
PTR32 data_offer;
ULONG formats;
UINT num_formats;
} *params32 = arg;
struct waylanddrv_unix_data_offer_enum_formats_params params;
params.data_offer = params32->data_offer;
params.formats = UlongToPtr(params32->formats);
params.num_formats = params32->num_formats;
return waylanddrv_unix_data_offer_enum_formats(&params);
}
const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
{
waylanddrv_unix_init,
......@@ -258,6 +274,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
waylanddrv_unix_clipboard_message_wow64,
waylanddrv_unix_data_offer_accept_format,
waylanddrv_unix_data_offer_import_format,
waylanddrv_unix_data_offer_enum_formats_wow64,
};
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