OSX: Handle encoding conversion for clipboard text

This commit is contained in:
Thierry Crozat 2018-04-11 00:04:48 +01:00
parent 0dae57ab2f
commit e79fc3ac76

View file

@ -24,11 +24,13 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL #define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "backends/platform/sdl/macosx/macosx_wrapper.h" #include "backends/platform/sdl/macosx/macosx_wrapper.h"
#include "common/translation.h"
#include <AppKit/NSPasteboard.h> #include <AppKit/NSPasteboard.h>
#include <Foundation/NSArray.h> #include <Foundation/NSArray.h>
#include <Foundation/NSPathUtilities.h> #include <Foundation/NSPathUtilities.h>
#include <AvailabilityMacros.h> #include <AvailabilityMacros.h>
#include <CoreFoundation/CFString.h>
bool hasTextInClipboardMacOSX() { bool hasTextInClipboardMacOSX() {
return [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]] != nil; return [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]] != nil;
@ -43,16 +45,30 @@ Common::String getTextFromClipboardMacOSX() {
NSString *str = [pb stringForType:NSStringPboardType]; NSString *str = [pb stringForType:NSStringPboardType];
if (str == nil) if (str == nil)
return Common::String(); return Common::String();
// If the string cannot be represented using the requested encoding we get a null pointer below.
// This is fine as ScummVM would not know what to do with non-ASCII characters (although maybe // If translations are supported, use the current TranslationManager charset and otherwise
// we should use NSISOLatin1StringEncoding?). // use ASCII. If the string cannot be represented using the requested encoding we get a null
return Common::String([str cStringUsingEncoding:NSASCIIStringEncoding]); // pointer below, which is fine as ScummVM would not know what to do with the string anyway.
#ifdef USE_TRANSLATION
NSString* encStr = [NSString stringWithCString:TransMan.getCurrentCharset().c_str() encoding:NSASCIIStringEncoding];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)encStr));
#else
NSStringEncoding encoding = NSISOLatin1StringEncoding;
#endif
return Common::String([str cStringUsingEncoding:encoding]);
} }
bool setTextInClipboardMacOSX(const Common::String &text) { bool setTextInClipboardMacOSX(const Common::String &text) {
NSPasteboard *pb = [NSPasteboard generalPasteboard]; NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
return [pb setString:[NSString stringWithCString:text.c_str() encoding:NSASCIIStringEncoding] forType:NSStringPboardType];
#ifdef USE_TRANSLATION
NSString* encStr = [NSString stringWithCString:TransMan.getCurrentCharset().c_str() encoding:NSASCIIStringEncoding];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)encStr));
#else
NSStringEncoding encoding = NSISOLatin1StringEncoding;
#endif
return [pb setString:[NSString stringWithCString:text.c_str() encoding:encoding] forType:NSStringPboardType];
} }
Common::String getDesktopPathMacOSX() { Common::String getDesktopPathMacOSX() {