Copy directly pasteboard data when pasting if it's UTF-8 encoded.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9962 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy
2013-09-04 14:39:59 +00:00
parent 0585de060c
commit cc68c2e43c
+22 -8
View File
@@ -2703,12 +2703,13 @@ static void convert_crlf(char * s, size_t len)
// fltk 1.3 clipboard support constant definitions: // fltk 1.3 clipboard support constant definitions:
const CFStringRef flavorNames[] = { const CFStringRef flavorNames[] = {
CFSTR("public.utf16-plain-text"),
CFSTR("public.utf8-plain-text"), CFSTR("public.utf8-plain-text"),
CFSTR("com.apple.traditional-mac-plain-text") }; CFSTR("public.utf16-plain-text"),
CFSTR("com.apple.traditional-mac-plain-text")
};
const CFStringEncoding encodings[] = { const CFStringEncoding encodings[] = {
kCFStringEncodingUnicode,
kCFStringEncodingUTF8, kCFStringEncodingUTF8,
kCFStringEncodingUnicode,
kCFStringEncodingMacRoman}; kCFStringEncodingMacRoman};
const size_t handledFlavorsCount = sizeof(encodings)/sizeof(CFStringEncoding); const size_t handledFlavorsCount = sizeof(encodings)/sizeof(CFStringEncoding);
@@ -2796,17 +2797,30 @@ void Fl::paste(Fl_Widget &receiver, int clipboard) {
if (found) break; if (found) break;
} }
if (found) { if (found) {
// Textual data was found in the pasteboard. Copy it directly if it's UTF-8 encoded,
// and put it in a CFString if it's in another encoding.
CFStringRef mycfs;
CFIndex len = CFDataGetLength(flavorData); CFIndex len = CFDataGetLength(flavorData);
CFStringRef mycfs = CFStringCreateWithBytes(NULL, CFDataGetBytePtr(flavorData), len, encoding, false); if (encoding != kCFStringEncodingUTF8) {
CFRelease(flavorData); mycfs = CFStringCreateWithBytes(NULL, CFDataGetBytePtr(flavorData), len, encoding, false);
len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(mycfs), kCFStringEncodingUTF8) + 1; CFRelease(flavorData);
len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(mycfs), kCFStringEncodingUTF8);
}
len++;
if ( len >= fl_selection_buffer_length[1] ) { if ( len >= fl_selection_buffer_length[1] ) {
fl_selection_buffer_length[1] = len; fl_selection_buffer_length[1] = len;
delete[] fl_selection_buffer[1]; delete[] fl_selection_buffer[1];
fl_selection_buffer[1] = new char[len]; fl_selection_buffer[1] = new char[len];
} }
CFStringGetCString(mycfs, fl_selection_buffer[1], len, kCFStringEncodingUTF8); if (encoding == kCFStringEncodingUTF8) {
CFRelease(mycfs); memcpy(fl_selection_buffer[1], CFDataGetBytePtr(flavorData), len-1);
CFRelease(flavorData);
fl_selection_buffer[1][len-1] = 0;
}
else {
CFStringGetCString(mycfs, fl_selection_buffer[1], len, kCFStringEncodingUTF8);
CFRelease(mycfs);
}
len = strlen(fl_selection_buffer[1]); len = strlen(fl_selection_buffer[1]);
fl_selection_length[1] = len; fl_selection_length[1] = len;
convert_crlf(fl_selection_buffer[1],len); // turn all \r characters into \n: convert_crlf(fl_selection_buffer[1],len); // turn all \r characters into \n: