winemac: Add basic support for importing the public.html pasteboard format.
Continue exporting in the original format under org.winehq.registered.HTML Format for fidelity when copying and pasting within Wine. Signed-off-by: Ken Thomases <ken@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c1f055d8df
commit
ed0de54f45
|
@ -70,6 +70,7 @@ static HANDLE import_clipboard_data(CFDataRef data);
|
||||||
static HANDLE import_bmp_to_bitmap(CFDataRef data);
|
static HANDLE import_bmp_to_bitmap(CFDataRef data);
|
||||||
static HANDLE import_bmp_to_dib(CFDataRef data);
|
static HANDLE import_bmp_to_dib(CFDataRef data);
|
||||||
static HANDLE import_enhmetafile(CFDataRef data);
|
static HANDLE import_enhmetafile(CFDataRef data);
|
||||||
|
static HANDLE import_html(CFDataRef data);
|
||||||
static HANDLE import_metafilepict(CFDataRef data);
|
static HANDLE import_metafilepict(CFDataRef data);
|
||||||
static HANDLE import_nsfilenames_to_hdrop(CFDataRef data);
|
static HANDLE import_nsfilenames_to_hdrop(CFDataRef data);
|
||||||
static HANDLE import_utf8_to_text(CFDataRef data);
|
static HANDLE import_utf8_to_text(CFDataRef data);
|
||||||
|
@ -177,13 +178,15 @@ static const struct
|
||||||
CFStringRef type;
|
CFStringRef type;
|
||||||
DRVIMPORTFUNC import;
|
DRVIMPORTFUNC import;
|
||||||
DRVEXPORTFUNC export;
|
DRVEXPORTFUNC export;
|
||||||
|
BOOL synthesized;
|
||||||
} builtin_format_names[] =
|
} builtin_format_names[] =
|
||||||
{
|
{
|
||||||
{ wszRichTextFormat, CFSTR("public.rtf"), import_clipboard_data, export_clipboard_data },
|
{ wszRichTextFormat, CFSTR("public.rtf"), import_clipboard_data, export_clipboard_data },
|
||||||
{ wszGIF, CFSTR("com.compuserve.gif"), 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 },
|
{ wszJFIF, CFSTR("public.jpeg"), import_clipboard_data, export_clipboard_data },
|
||||||
{ wszPNG, CFSTR("public.png"), 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 },
|
{ 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_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 */
|
/* Register known mappings between Windows formats and Mac types */
|
||||||
for (i = 0; i < sizeof(builtin_format_names)/sizeof(builtin_format_names[0]); i++)
|
for (i = 0; i < sizeof(builtin_format_names)/sizeof(builtin_format_names[0]); i++)
|
||||||
{
|
{
|
||||||
if (!(format = HeapAlloc(GetProcessHeap(), 0, sizeof(*format)))) break;
|
if (!(format = HeapAlloc(GetProcessHeap(), 0, sizeof(*format)))) break;
|
||||||
format->format_id = RegisterClipboardFormatW(builtin_format_names[i].name);
|
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->import_func = builtin_format_names[i].import;
|
||||||
format->export_func = builtin_format_names[i].export;
|
format->export_func = builtin_format_names[i].export;
|
||||||
format->synthesized = FALSE;
|
format->synthesized = builtin_format_names[i].synthesized;
|
||||||
format->natural_format = NULL;
|
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_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"
|
||||||
|
"<!--StartFragment-->";
|
||||||
|
static const char trailer[] = "\n<!--EndFragment-->";
|
||||||
|
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
|
* import_metafilepict
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue