GUI: U32: Use u32 in clipboards for MacOS

This commit is contained in:
aryanrawlani28 2020-06-22 23:25:43 +05:30 committed by Eugene Sandulenko
parent a9a816e7fe
commit 4bcac1df17
4 changed files with 28 additions and 20 deletions

View file

@ -138,11 +138,11 @@ bool OSystem_MacOSX::hasTextInClipboard() {
return hasTextInClipboardMacOSX();
}
Common::String OSystem_MacOSX::getTextFromClipboard() {
Common::U32String OSystem_MacOSX::getTextFromClipboard() {
return getTextFromClipboardMacOSX();
}
bool OSystem_MacOSX::setTextInClipboard(const Common::String &text) {
bool OSystem_MacOSX::setTextInClipboard(const Common::U32String &text) {
return setTextInClipboardMacOSX(text);
}

View file

@ -34,8 +34,8 @@ public:
virtual bool displayLogFile();
virtual bool hasTextInClipboard();
virtual Common::String getTextFromClipboard();
virtual bool setTextInClipboard(const Common::String &text);
virtual Common::U32String getTextFromClipboard();
virtual bool setTextInClipboard(const Common::U32String &text);
virtual bool openUrl(const Common::String &url);

View file

@ -24,10 +24,11 @@
#define PLATFORM_SDL_MACOSX_WRAPPER_H
#include <common/str.h>
#include <common/ustr.h>
bool hasTextInClipboardMacOSX();
Common::String getTextFromClipboardMacOSX();
bool setTextInClipboardMacOSX(const Common::String &text);
Common::U32String getTextFromClipboardMacOSX();
bool setTextInClipboardMacOSX(const Common::U32String &text);
Common::String getDesktopPathMacOSX();
#endif

View file

@ -36,39 +36,46 @@ bool hasTextInClipboardMacOSX() {
return [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]] != nil;
}
Common::String getTextFromClipboardMacOSX() {
Common::U32String getTextFromClipboardMacOSX() {
if (!hasTextInClipboardMacOSX())
return Common::String();
return Common::U32String();
// Note: on OS X 10.6 and above it is recommanded to use NSPasteboardTypeString rather than NSStringPboardType.
// But since we still target older version use NSStringPboardType.
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSString *str = [pb stringForType:NSStringPboardType];
if (str == nil)
return Common::String();
return Common::U32String();
// If translations are supported, use the current TranslationManager charset and otherwise
// use ASCII. If the string cannot be represented using the requested encoding we get a null
// 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));
#ifdef SCUMM_LITTLE_ENDIAN
NSStringEncoding stringEncoding = NSUTF32LittleEndianStringEncoding;
#else
NSStringEncoding encoding = NSISOLatin1StringEncoding;
NSStringEncoding stringEncoding = NSUTF32BigEndianStringEncoding;
#endif
return Common::String([str cStringUsingEncoding:encoding]);
NSUInteger textLength = [str length];
uint32 *text = new uint32[textLength];
if (![str getBytes:text maxLength:4*textLength usedLength:NULL encoding: stringEncoding options:0 range:NSMakeRange(0, textLength-1) remainingRange:NULL]) {
delete[] text;
return Common::U32String();
}
Common::U32String u32String(text, textLength);
delete[] text;
return u32String;
}
bool setTextInClipboardMacOSX(const Common::String &text) {
bool setTextInClipboardMacOSX(const Common::U32String &text) {
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
#ifdef USE_TRANSLATION
NSString* encStr = [NSString stringWithCString:TransMan.getCurrentCharset().c_str() encoding:NSASCIIStringEncoding];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)encStr));
#ifdef SCUMM_LITTLE_ENDIAN
NSStringEncoding stringEncoding = NSUTF32LittleEndianStringEncoding;
#else
NSStringEncoding encoding = NSISOLatin1StringEncoding;
NSStringEncoding stringEncoding = NSUTF32BigEndianStringEncoding;
#endif
return [pb setString:[NSString stringWithCString:text.c_str() encoding:encoding] forType:NSStringPboardType];
return [pb setString:[[NSString alloc] initWithBytes:text.c_str() length:4*text.size() encoding: stringEncoding] forType:NSStringPboardType];
}
Common::String getDesktopPathMacOSX() {