diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c index fc1589ffeb6..fdd1110cacc 100644 --- a/dlls/winemac.drv/clipboard.c +++ b/dlls/winemac.drv/clipboard.c @@ -70,6 +70,7 @@ static HANDLE import_clipboard_data(CFDataRef data); static HANDLE import_bmp_to_bitmap(CFDataRef data); static HANDLE import_bmp_to_dib(CFDataRef data); static HANDLE import_enhmetafile(CFDataRef data); +static HANDLE import_html(CFDataRef data); static HANDLE import_metafilepict(CFDataRef data); static HANDLE import_nsfilenames_to_hdrop(CFDataRef data); static HANDLE import_utf8_to_text(CFDataRef data); @@ -177,13 +178,15 @@ static const struct CFStringRef type; DRVIMPORTFUNC import; DRVEXPORTFUNC export; + BOOL synthesized; } builtin_format_names[] = { { wszRichTextFormat, CFSTR("public.rtf"), import_clipboard_data, export_clipboard_data }, { wszGIF, CFSTR("com.compuserve.gif"), import_clipboard_data, export_clipboard_data }, { wszJFIF, CFSTR("public.jpeg"), import_clipboard_data, export_clipboard_data }, { wszPNG, CFSTR("public.png"), import_clipboard_data, export_clipboard_data }, - { wszHTMLFormat, CFSTR("public.html"), import_clipboard_data, export_clipboard_data }, + { wszHTMLFormat, NULL, import_clipboard_data, export_clipboard_data }, + { wszHTMLFormat, CFSTR("public.html"), import_html, NULL, TRUE }, { CFSTR_SHELLURLW, CFSTR("public.url"), import_utf8_to_text, export_text_to_utf8 }, }; @@ -355,24 +358,32 @@ static void register_builtin_formats(void) list_add_tail(&format_list, &format->entry); } - LIST_FOR_EACH_ENTRY(format, &format_list, WINE_CLIPFORMAT, entry) - { - if (format->synthesized) - format->natural_format = natural_format_for_format(format->format_id); - } - /* Register known mappings between Windows formats and Mac types */ for (i = 0; i < sizeof(builtin_format_names)/sizeof(builtin_format_names[0]); i++) { if (!(format = HeapAlloc(GetProcessHeap(), 0, sizeof(*format)))) break; format->format_id = RegisterClipboardFormatW(builtin_format_names[i].name); - format->type = CFRetain(builtin_format_names[i].type); format->import_func = builtin_format_names[i].import; format->export_func = builtin_format_names[i].export; - format->synthesized = FALSE; + format->synthesized = builtin_format_names[i].synthesized; format->natural_format = NULL; + + if (builtin_format_names[i].type) + format->type = CFRetain(builtin_format_names[i].type); + else + { + format->type = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@%S"), + registered_name_type_prefix, builtin_format_names[i].name); + } + list_add_tail(&format_list, &format->entry); } + + LIST_FOR_EACH_ENTRY(format, &format_list, WINE_CLIPFORMAT, entry) + { + if (format->synthesized) + format->natural_format = natural_format_for_format(format->format_id); + } } @@ -615,6 +626,39 @@ static HANDLE import_enhmetafile(CFDataRef data) } +/************************************************************************** + * import_html + * + * Import HTML data. + */ +static HANDLE import_html(CFDataRef data) +{ + static const char header[] = + "Version:0.9\n" + "StartHTML:0000000100\n" + "EndHTML:%010lu\n" + "StartFragment:%010lu\n" + "EndFragment:%010lu\n" + ""; + static const char trailer[] = "\n"; + HANDLE ret; + SIZE_T len, total; + size_t size = CFDataGetLength(data); + + len = strlen(header) + 12; /* 3 * 4 extra chars for %010lu */ + total = len + size + sizeof(trailer); + if ((ret = GlobalAlloc(GMEM_FIXED, total))) + { + char *p = ret; + p += sprintf(p, header, total - 1, len, len + size + 1 /* include the final \n in the data */); + CFDataGetBytes(data, CFRangeMake(0, size), (UInt8*)p); + strcpy(p + size, trailer); + TRACE("returning %s\n", debugstr_a(ret)); + } + return ret; +} + + /************************************************************************** * import_metafilepict *