From: Alexandros Frantzis alexandros.frantzis@collabora.com
Introduce the infrastructure to export various clipboard formats in a table-driven manner, similar to what's used by winex11. --- dlls/winewayland.drv/wayland_data_device.c | 62 +++++++++++++++++++--- 1 file changed, 54 insertions(+), 8 deletions(-)
diff --git a/dlls/winewayland.drv/wayland_data_device.c b/dlls/winewayland.drv/wayland_data_device.c index b51f5b25ed4..77b9f4f7af0 100644 --- a/dlls/winewayland.drv/wayland_data_device.c +++ b/dlls/winewayland.drv/wayland_data_device.c @@ -33,6 +33,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(clipboard);
+struct data_device_format +{ + const char *mime_type; + UINT clipboard_format; + void *(*export)(void *data, size_t size, size_t *ret_size); +}; + static HWND clipboard_hwnd;
static void write_all(int fd, const void *buf, size_t count) @@ -72,17 +79,49 @@ static void *export_unicode_text(void *data, size_t size, size_t *ret_size) return bytes; }
+/* Order is important. When selecting a mime-type for a clipboard format we + * will choose the first entry that matches the specified clipboard format. */ +static struct data_device_format supported_formats[] = +{ + {"text/plain;charset=utf-8", CF_UNICODETEXT, export_unicode_text}, + {NULL, 0, NULL}, +}; + +static struct data_device_format *data_device_format_for_clipboard_format(UINT clipboard_format) +{ + struct data_device_format *format; + + for (format = supported_formats; format->mime_type; ++format) + { + if (format->clipboard_format == clipboard_format) return format; + } + + return NULL; +} + +static struct data_device_format *data_device_format_for_mime_type(const char *mime) +{ + struct data_device_format *format; + + for (format = supported_formats; format->mime_type; ++format) + { + if (!strcmp(mime, format->mime_type)) return format; + } + + return NULL; +} + /********************************************************************** * zwlr_data_control_source_v1 handling */
-static void wayland_data_source_export(int32_t fd) +static void wayland_data_source_export(struct data_device_format *format, int fd) { struct get_clipboard_params params = { .data_only = TRUE, .size = 1024 }; void *exported = NULL; size_t exported_size;
- TRACE("\n"); + TRACE("format=%u => mime=%s\n", format->clipboard_format, format->mime_type);
if (!NtUserOpenClipboard(clipboard_hwnd, 0)) { @@ -93,9 +132,9 @@ static void wayland_data_source_export(int32_t fd) for (;;) { if (!(params.data = malloc(params.size))) break; - if (NtUserGetClipboardData(CF_UNICODETEXT, ¶ms)) + if (NtUserGetClipboardData(format->clipboard_format, ¶ms)) { - exported = export_unicode_text(params.data, params.size, &exported_size); + exported = format->export(params.data, params.size, &exported_size); break; } if (!params.data_size) break; @@ -115,8 +154,10 @@ static void data_control_source_send(void *data, struct zwlr_data_control_source_v1 *source, const char *mime_type, int32_t fd) { - if (!strcmp(mime_type, "text/plain;charset=utf-8")) - wayland_data_source_export(fd); + struct data_device_format *format = + data_device_format_for_mime_type(mime_type); + + if (format) wayland_data_source_export(format, fd); close(fd); }
@@ -190,8 +231,13 @@ static void clipboard_update(void)
for (i = 0; i < formats_size; ++i) { - if (formats[i] == CF_UNICODETEXT) - zwlr_data_control_source_v1_offer(source, "text/plain;charset=utf-8"); + struct data_device_format *format = + data_device_format_for_clipboard_format(formats[i]); + if (format) + { + TRACE("offering mime=%s for format=%u\n", format->mime_type, formats[i]); + zwlr_data_control_source_v1_offer(source, format->mime_type); + } }
free(formats);