NSUInteger should be an `unsigned int` on 32-bit Tiger, and an `unsigned long` on 64-bit Tiger. In practice, this wasn't really a problem since we were always using `unsigned long` which has the same width on 32-bit Tiger, but still it's more correct to do what the official 10.5 SDK does. The preprocessor defines come from Apple's documentation and from their SDK. We can use it as-is, since we're in the backend code, and already in an ifdef only targeting Tiger (where I've tested this change). Also fix a small GCC warning while there.
136 lines
5.4 KiB
Text
136 lines
5.4 KiB
Text
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
// Disable symbol overrides so that we can use system headers.
|
|
#define FORBIDDEN_SYMBOL_ALLOW_ALL
|
|
|
|
#include "backends/platform/sdl/macosx/macosx_wrapper.h"
|
|
#include "backends/platform/sdl/macosx/macosx-compat.h"
|
|
|
|
#include <AppKit/NSPasteboard.h>
|
|
#include <Foundation/NSArray.h>
|
|
#include <Foundation/NSBundle.h>
|
|
#include <Foundation/NSPathUtilities.h>
|
|
#include <AvailabilityMacros.h>
|
|
#include <CoreFoundation/CFString.h>
|
|
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
|
|
#define NSPasteboardTypeString NSStringPboardType
|
|
#endif
|
|
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
|
|
// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html
|
|
#if __LP64__ || NS_BUILD_32_LIKE_64
|
|
typedef unsigned long NSUInteger;
|
|
#else
|
|
typedef unsigned int NSUInteger;
|
|
#endif
|
|
|
|
// Those are not defined in the 10.4 SDK, but they are defined when targeting
|
|
// Mac OS X 10.4 or above in the 10.5 SDK, and they do work with 10.4.
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
|
|
enum {
|
|
NSUTF32StringEncoding = 0x8c000100,
|
|
NSUTF32BigEndianStringEncoding = 0x98000100,
|
|
NSUTF32LittleEndianStringEncoding = 0x9c000100
|
|
};
|
|
#endif
|
|
#endif
|
|
|
|
bool hasTextInClipboardMacOSX() {
|
|
return [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObject:NSPasteboardTypeString]] != nil;
|
|
}
|
|
|
|
Common::U32String getTextFromClipboardMacOSX() {
|
|
if (!hasTextInClipboardMacOSX())
|
|
return Common::U32String();
|
|
|
|
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
|
NSString *str = [pb stringForType:NSPasteboardTypeString];
|
|
if (![str respondsToSelector:@selector(getBytes:maxLength:usedLength:encoding:options:range:remainingRange:)])
|
|
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 SCUMM_LITTLE_ENDIAN
|
|
NSStringEncoding stringEncoding = NSUTF32LittleEndianStringEncoding;
|
|
#else
|
|
NSStringEncoding stringEncoding = NSUTF32BigEndianStringEncoding;
|
|
#endif
|
|
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) remainingRange:NULL]) {
|
|
delete[] text;
|
|
return Common::U32String();
|
|
}
|
|
Common::U32String u32String(text, textLength);
|
|
delete[] text;
|
|
|
|
return u32String;
|
|
}
|
|
|
|
bool setTextInClipboardMacOSX(const Common::U32String &text) {
|
|
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
|
[pb declareTypes:[NSArray arrayWithObject:NSPasteboardTypeString] owner:nil];
|
|
|
|
#ifdef SCUMM_LITTLE_ENDIAN
|
|
NSStringEncoding stringEncoding = NSUTF32LittleEndianStringEncoding;
|
|
#else
|
|
NSStringEncoding stringEncoding = NSUTF32BigEndianStringEncoding;
|
|
#endif
|
|
NSString *nsstring = [[NSString alloc] initWithBytes:text.c_str() length:4*text.size() encoding: stringEncoding];
|
|
bool status = [pb setString:nsstring forType:NSPasteboardTypeString];
|
|
[nsstring release];
|
|
return status;
|
|
}
|
|
|
|
Common::String getDesktopPathMacOSX() {
|
|
// The recommended method is to use NSFileManager.
|
|
// NSUrl *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDesktopDirectory inDomains:NSUserDomainMask] firstObject];
|
|
// However it is only available in OS X 10.6+. So use NSSearchPathForDirectoriesInDomains instead (available since OS X 10.0)
|
|
// [NSArray firstObject] is also only available in OS X 10.6+. So we need to use [NSArray count] and [NSArray objectAtIndex:]
|
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
|
|
if ([paths count] == 0)
|
|
return Common::String();
|
|
NSString *path = [paths objectAtIndex:0];
|
|
if (path == nil)
|
|
return Common::String();
|
|
return Common::String([path fileSystemRepresentation]);
|
|
}
|
|
|
|
Common::String getResourceAppBundlePathMacOSX() {
|
|
NSString *bundlePath = [[NSBundle mainBundle] resourcePath];
|
|
if (bundlePath == nil)
|
|
return Common::String();
|
|
return Common::String([bundlePath fileSystemRepresentation]);
|
|
}
|
|
|
|
Common::String getAppSupportPathMacOSX() {
|
|
// See comments in getDesktopPathMacOSX() as we use the same methods
|
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
|
|
if ([paths count] == 0)
|
|
return Common::String();
|
|
NSString *path = [paths objectAtIndex:0];
|
|
if (path == nil)
|
|
return Common::String();
|
|
return Common::String([path fileSystemRepresentation]) + "/ScummVM";
|
|
}
|