Attachment "clipboard.patch" to
ticket [00a27923]
added by
chw
2017-12-30 14:14:05.
Index: tk/macosx/tkMacOSXClipboard.c
==================================================================
--- tk/macosx/tkMacOSXClipboard.c
+++ tk/macosx/tkMacOSXClipboard.c
@@ -26,26 +26,36 @@
{
NSMutableString *string = [NSMutableString new];
if (dispPtr && dispPtr->clipboardActive &&
[type isEqualToString:NSStringPboardType]) {
+ Tcl_Encoding utf8 = Tcl_GetEncoding(NULL, "utf-8");
+ Tcl_DString ds;
+
+ Tcl_DStringInit(&ds);
for (TkClipboardTarget *targetPtr = dispPtr->clipTargetPtr; targetPtr;
targetPtr = targetPtr->nextPtr) {
if (targetPtr->type == XA_STRING ||
targetPtr->type == dispPtr->utf8Atom) {
for (TkClipboardBuffer *cbPtr = targetPtr->firstBufferPtr;
cbPtr; cbPtr = cbPtr->nextPtr) {
- NSString *s = [[NSString alloc] initWithBytesNoCopy:
- cbPtr->buffer length:cbPtr->length
+ char *p = Tcl_UtfToExternalDString(utf8, cbPtr->buffer,
+ cbPtr->length, &ds);
+ int len = Tcl_DStringLength(&ds);
+ NSString *s = [[NSString alloc] initWithBytesNoCopy:p
+ length:len
encoding:NSUTF8StringEncoding freeWhenDone:NO];
[string appendString:s];
[s release];
+ Tcl_DStringSetLength(&ds, 0);
}
break;
}
}
+ Tcl_DStringFree(&ds);
+ Tcl_FreeEncoding(utf8);
}
[sender setString:string forType:type];
[string release];
}
@@ -129,15 +139,24 @@
|| target == dispPtr->utf8Atom)) {
NSString *string = nil;
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSString *type = [pb availableTypeFromArray:[NSArray arrayWithObject:
NSStringPboardType]];
+ Tcl_DString ds;
if (type) {
string = [pb stringForType:type];
}
- result = proc(clientData, interp, string ? [string UTF8String] : "");
+ Tcl_DStringInit(&ds);
+ if (string) {
+ Tcl_Encoding utf8 = Tcl_GetEncoding(NULL, "utf-8");
+
+ Tcl_ExternalToUtfDString(utf8, [string UTF8String], -1, &ds);
+ Tcl_FreeEncoding(utf8);
+ }
+ result = proc(clientData, interp, Tcl_DStringValue(&ds));
+ Tcl_DStringFree(&ds);
} else {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"%s selection doesn't exist or form \"%s\" not defined",
Tk_GetAtomName(tkwin, selection),
Tk_GetAtomName(tkwin, target)));