Merge branch 'master' into jgrpp
# Conflicts: # src/os/macosx/macos.mm # src/video/cocoa/cocoa_v.mm # src/video/cocoa/fullscreen.mm # src/video/cocoa/wnd_quartz.mm # src/video/cocoa/wnd_quickdraw.mm
This commit is contained in:
@@ -45,10 +45,7 @@
|
||||
*/
|
||||
|
||||
|
||||
@interface OTTDMain : NSObject
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||
<NSApplicationDelegate>
|
||||
#endif
|
||||
@interface OTTDMain : NSObject <NSApplicationDelegate>
|
||||
@end
|
||||
|
||||
|
||||
@@ -159,7 +156,9 @@ static void setApplicationMenu()
|
||||
/* Tell the application object that this is now the application menu.
|
||||
* This interesting Objective-C construct is used because not all SDK
|
||||
* versions define this method publicly. */
|
||||
[ NSApp performSelector:@selector(setAppleMenu:) withObject:appleMenu ];
|
||||
if ([ NSApp respondsToSelector:@selector(setAppleMenu:) ]) {
|
||||
[ NSApp performSelector:@selector(setAppleMenu:) withObject:appleMenu ];
|
||||
}
|
||||
|
||||
/* Finally give up our references to the objects */
|
||||
[ appleMenu release ];
|
||||
@@ -204,13 +203,9 @@ static void setupApplication()
|
||||
/* Ensure the application object is initialised */
|
||||
[ NSApplication sharedApplication ];
|
||||
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
|
||||
/* Tell the dock about us */
|
||||
if (MacOSVersionIsAtLeast(10, 3, 0)) {
|
||||
OSStatus returnCode = TransformProcessType(&psn, kProcessTransformToForegroundApplication);
|
||||
if (returnCode != 0) DEBUG(driver, 0, "Could not change to foreground application. Error %d", (int)returnCode);
|
||||
}
|
||||
#endif
|
||||
OSStatus returnCode = TransformProcessType(&psn, kProcessTransformToForegroundApplication);
|
||||
if (returnCode != 0) DEBUG(driver, 0, "Could not change to foreground application. Error %d", (int)returnCode);
|
||||
|
||||
/* Disable the system-wide tab feature as we only have one window. */
|
||||
if ([ NSWindow respondsToSelector:@selector(setAllowsAutomaticWindowTabbing:) ]) {
|
||||
@@ -243,57 +238,27 @@ static bool ModeSorter(const OTTD_Point &p1, const OTTD_Point &p2)
|
||||
|
||||
static void QZ_GetDisplayModeInfo(CFArrayRef modes, CFIndex i, int &bpp, uint16 &width, uint16 &height)
|
||||
{
|
||||
bpp = 0;
|
||||
width = 0;
|
||||
height = 0;
|
||||
CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
|
||||
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||
if (MacOSVersionIsAtLeast(10, 6, 0)) {
|
||||
CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
|
||||
|
||||
width = (uint16)CGDisplayModeGetWidth(mode);
|
||||
height = (uint16)CGDisplayModeGetHeight(mode);
|
||||
width = (uint16)CGDisplayModeGetWidth(mode);
|
||||
height = (uint16)CGDisplayModeGetHeight(mode);
|
||||
|
||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11)
|
||||
/* Extract bit depth from mode string. */
|
||||
CFAutoRelease<CFStringRef> pixEnc(CGDisplayModeCopyPixelEncoding(mode));
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 32;
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 16;
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 8;
|
||||
/* Extract bit depth from mode string. */
|
||||
CFAutoRelease<CFStringRef> pixEnc(CGDisplayModeCopyPixelEncoding(mode));
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 32;
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 16;
|
||||
if (CFStringCompare(pixEnc.get(), CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 8;
|
||||
#else
|
||||
/* CGDisplayModeCopyPixelEncoding is deprecated on OSX 10.11+, but there are no 8 bpp modes anyway... */
|
||||
bpp = 32;
|
||||
/* CGDisplayModeCopyPixelEncoding is deprecated on OSX 10.11+, but there are no 8 bpp modes anyway... */
|
||||
bpp = 32;
|
||||
#endif
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
int intvalue;
|
||||
|
||||
CFDictionaryRef onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(modes, i);
|
||||
CFNumberRef number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
|
||||
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
|
||||
bpp = intvalue;
|
||||
|
||||
number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
|
||||
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
|
||||
width = (uint16)intvalue;
|
||||
|
||||
number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
|
||||
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
|
||||
height = (uint16)intvalue;
|
||||
}
|
||||
}
|
||||
|
||||
uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_id, int device_depth)
|
||||
{
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6)
|
||||
CFArrayRef mode_list = MacOSVersionIsAtLeast(10, 6, 0) ? CGDisplayCopyAllDisplayModes(display_id, nullptr) : CGDisplayAvailableModes(display_id);
|
||||
#elif (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||
CFArrayRef mode_list = CGDisplayCopyAllDisplayModes(display_id, nullptr);
|
||||
#else
|
||||
CFArrayRef mode_list = CGDisplayAvailableModes(display_id);
|
||||
#endif
|
||||
CFIndex num_modes = CFArrayGetCount(mode_list);
|
||||
CFAutoRelease<CFArrayRef> mode_list(CGDisplayCopyAllDisplayModes(display_id, nullptr));
|
||||
CFIndex num_modes = CFArrayGetCount(mode_list.get());
|
||||
|
||||
/* Build list of modes with the requested bpp */
|
||||
uint count = 0;
|
||||
@@ -301,7 +266,7 @@ uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_i
|
||||
int bpp;
|
||||
uint16 width, height;
|
||||
|
||||
QZ_GetDisplayModeInfo(mode_list, i, bpp, width, height);
|
||||
QZ_GetDisplayModeInfo(mode_list.get(), i, bpp, width, height);
|
||||
|
||||
if (bpp != device_depth) continue;
|
||||
|
||||
@@ -325,29 +290,9 @@ uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_i
|
||||
/* Sort list smallest to largest */
|
||||
std::sort(modes, modes + count, ModeSorter);
|
||||
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||
if (MacOSVersionIsAtLeast(10, 6, 0)) CFRelease(mode_list);
|
||||
#endif
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/** Small function to test if the main display can display 8 bpp in fullscreen */
|
||||
bool QZ_CanDisplay8bpp()
|
||||
{
|
||||
/* 8bpp modes are deprecated starting in 10.5. CoreGraphics will return them
|
||||
* as available in the display list, but many features (e.g. palette animation)
|
||||
* will be broken. */
|
||||
if (MacOSVersionIsAtLeast(10, 5, 0)) return false;
|
||||
|
||||
OTTD_Point p;
|
||||
|
||||
/* We want to know if 8 bpp is possible in fullscreen and not anything about
|
||||
* resolutions. Because of this we want to fill a list of 1 resolution of 8 bpp
|
||||
* on display 0 (main) and return if we found one. */
|
||||
return QZ_ListModes(&p, 1, 0, 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the video modus.
|
||||
*
|
||||
@@ -395,35 +340,11 @@ void QZ_GameSizeChanged()
|
||||
*/
|
||||
static CocoaSubdriver *QZ_CreateWindowSubdriver(int width, int height, int bpp)
|
||||
{
|
||||
#if defined(ENABLE_COCOA_QUARTZ) || defined(ENABLE_COCOA_QUICKDRAW)
|
||||
CocoaSubdriver *ret;
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_COCOA_QUARTZ) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
|
||||
/* The reason for the version mismatch is due to the fact that the 10.4 binary needs to work on 10.5 as well. */
|
||||
if (MacOSVersionIsAtLeast(10, 5, 0)) {
|
||||
ret = QZ_CreateWindowQuartzSubdriver(width, height, bpp);
|
||||
if (ret != nullptr) return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_COCOA_QUICKDRAW
|
||||
ret = QZ_CreateWindowQuickdrawSubdriver(width, height, bpp);
|
||||
if (ret != nullptr) return ret;
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_COCOA_QUARTZ) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
|
||||
/*
|
||||
* If we get here we are running 10.4 or earlier and either openttd was compiled without the QuickDraw driver
|
||||
* or it failed to load for some reason. Fall back to Quartz if possible even though that driver is slower.
|
||||
*/
|
||||
if (MacOSVersionIsAtLeast(10, 4, 0)) {
|
||||
ret = QZ_CreateWindowQuartzSubdriver(width, height, bpp);
|
||||
if (ret != nullptr) return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_COCOA_QUARTZ)
|
||||
return QZ_CreateWindowQuartzSubdriver(width, height, bpp);
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -438,17 +359,8 @@ static CocoaSubdriver *QZ_CreateWindowSubdriver(int width, int height, int bpp)
|
||||
*/
|
||||
static CocoaSubdriver *QZ_CreateSubdriver(int width, int height, int bpp, bool fullscreen, bool fallback)
|
||||
{
|
||||
CocoaSubdriver *ret = nullptr;
|
||||
/* OSX 10.7 allows to toggle fullscreen mode differently */
|
||||
if (MacOSVersionIsAtLeast(10, 7, 0)) {
|
||||
ret = QZ_CreateWindowSubdriver(width, height, bpp);
|
||||
if (ret != nullptr && fullscreen) ret->ToggleFullscreen();
|
||||
}
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9)
|
||||
else {
|
||||
ret = fullscreen ? QZ_CreateFullscreenSubdriver(width, height, bpp) : QZ_CreateWindowSubdriver(width, height, bpp);
|
||||
}
|
||||
#endif /* (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9) */
|
||||
CocoaSubdriver *ret = QZ_CreateWindowSubdriver(width, height, bpp);
|
||||
if (ret != nullptr && fullscreen) ret->ToggleFullscreen();
|
||||
|
||||
if (ret != nullptr) return ret;
|
||||
if (!fallback) return nullptr;
|
||||
@@ -458,16 +370,6 @@ static CocoaSubdriver *QZ_CreateSubdriver(int width, int height, int bpp, bool f
|
||||
ret = QZ_CreateWindowSubdriver(640, 480, bpp);
|
||||
if (ret != nullptr) return ret;
|
||||
|
||||
#if defined(_DEBUG) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9)
|
||||
/* This Fullscreen mode crashes on OSX 10.7 */
|
||||
if (!MacOSVersionIsAtLeast(10, 7, 0)) {
|
||||
/* Try fullscreen too when in debug mode */
|
||||
DEBUG(driver, 0, "Setting video mode failed, falling back to 640x480 fullscreen mode.");
|
||||
ret = QZ_CreateFullscreenSubdriver(640, 480, bpp);
|
||||
if (ret != nullptr) return ret;
|
||||
}
|
||||
#endif /* defined(_DEBUG) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9) */
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -496,7 +398,7 @@ void VideoDriver_Cocoa::Stop()
|
||||
*/
|
||||
const char *VideoDriver_Cocoa::Start(const char * const *parm)
|
||||
{
|
||||
if (!MacOSVersionIsAtLeast(10, 3, 0)) return "The Cocoa video driver requires Mac OS X 10.3 or later.";
|
||||
if (!MacOSVersionIsAtLeast(10, 6, 0)) return "The Cocoa video driver requires Mac OS X 10.6 or later.";
|
||||
|
||||
if (_cocoa_video_started) return "Already started";
|
||||
_cocoa_video_started = true;
|
||||
@@ -579,29 +481,7 @@ bool VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
|
||||
{
|
||||
assert(_cocoa_subdriver != nullptr);
|
||||
|
||||
/* For 10.7 and later, we try to toggle using the quartz subdriver. */
|
||||
if (_cocoa_subdriver->ToggleFullscreen()) return true;
|
||||
|
||||
bool oldfs = _cocoa_subdriver->IsFullscreen();
|
||||
if (full_screen != oldfs) {
|
||||
int width = _cocoa_subdriver->GetWidth();
|
||||
int height = _cocoa_subdriver->GetHeight();
|
||||
int bpp = BlitterFactory::GetCurrentBlitter()->GetScreenDepth();
|
||||
|
||||
delete _cocoa_subdriver;
|
||||
_cocoa_subdriver = nullptr;
|
||||
|
||||
_cocoa_subdriver = QZ_CreateSubdriver(width, height, bpp, full_screen, false);
|
||||
if (_cocoa_subdriver == nullptr) {
|
||||
_cocoa_subdriver = QZ_CreateSubdriver(width, height, bpp, oldfs, true);
|
||||
if (_cocoa_subdriver == nullptr) error("Cocoa: Failed to create subdriver");
|
||||
}
|
||||
}
|
||||
|
||||
QZ_GameSizeChanged();
|
||||
QZ_UpdateVideoModes();
|
||||
|
||||
return _cocoa_subdriver->IsFullscreen() == full_screen;
|
||||
return _cocoa_subdriver->ToggleFullscreen();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -619,16 +499,7 @@ bool VideoDriver_Cocoa::AfterBlitterChange()
|
||||
*/
|
||||
void VideoDriver_Cocoa::EditBoxLostFocus()
|
||||
{
|
||||
if (_cocoa_subdriver != nullptr) {
|
||||
if ([ _cocoa_subdriver->cocoaview respondsToSelector:@selector(inputContext) ] && [ [ _cocoa_subdriver->cocoaview performSelector:@selector(inputContext) ] respondsToSelector:@selector(discardMarkedText) ]) {
|
||||
[ [ _cocoa_subdriver->cocoaview performSelector:@selector(inputContext) ] performSelector:@selector(discardMarkedText) ];
|
||||
}
|
||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6)
|
||||
else {
|
||||
[ [ NSInputManager currentInputManager ] markedTextAbandoned:_cocoa_subdriver->cocoaview ];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (_cocoa_subdriver != NULL) [ [ _cocoa_subdriver->cocoaview inputContext ] discardMarkedText ];
|
||||
/* Clear any marked string from the current edit box. */
|
||||
HandleTextInput(nullptr, true);
|
||||
}
|
||||
@@ -654,22 +525,13 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
|
||||
return;
|
||||
}
|
||||
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3)
|
||||
if (MacOSVersionIsAtLeast(10, 3, 0)) {
|
||||
NSAlert *alert = [ [ NSAlert alloc ] init ];
|
||||
[ alert setAlertStyle: NSCriticalAlertStyle ];
|
||||
[ alert setMessageText:[ NSString stringWithUTF8String:title ] ];
|
||||
[ alert setInformativeText:[ NSString stringWithUTF8String:message ] ];
|
||||
[ alert addButtonWithTitle: [ NSString stringWithUTF8String:buttonLabel ] ];
|
||||
[ alert runModal ];
|
||||
[ alert release ];
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3)
|
||||
NSRunAlertPanel([ NSString stringWithUTF8String:title ], [ NSString stringWithUTF8String:message ], [ NSString stringWithUTF8String:buttonLabel ], nil, nil);
|
||||
#endif
|
||||
}
|
||||
NSAlert *alert = [ [ NSAlert alloc ] init ];
|
||||
[ alert setAlertStyle: NSCriticalAlertStyle ];
|
||||
[ alert setMessageText:[ NSString stringWithUTF8String:title ] ];
|
||||
[ alert setInformativeText:[ NSString stringWithUTF8String:message ] ];
|
||||
[ alert addButtonWithTitle: [ NSString stringWithUTF8String:buttonLabel ] ];
|
||||
[ alert runModal ];
|
||||
[ alert release ];
|
||||
|
||||
if (!wasstarted && VideoDriver::GetInstance() != nullptr) VideoDriver::GetInstance()->Stop();
|
||||
|
||||
@@ -1095,17 +957,7 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count)
|
||||
{
|
||||
if (!EditBoxInGlobalFocus()) return NSNotFound;
|
||||
|
||||
NSPoint view_pt = NSZeroPoint;
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7)
|
||||
if ([ [ self window ] respondsToSelector:@selector(convertRectFromScreen:) ]) {
|
||||
view_pt = [ self convertRect:[ [ self window ] convertRectFromScreen:NSMakeRect(thePoint.x, thePoint.y, 0, 0) ] fromView:nil ].origin;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7)
|
||||
view_pt = [ self convertPoint:[ [ self window ] convertScreenToBase:thePoint ] fromView:nil ];
|
||||
#endif
|
||||
}
|
||||
NSPoint view_pt = [ self convertRect:[ [ self window ] convertRectFromScreen:NSMakeRect(thePoint.x, thePoint.y, 0, 0) ] fromView:nil ].origin;
|
||||
|
||||
Point pt = { (int)view_pt.x, (int)[ self frame ].size.height - (int)view_pt.y };
|
||||
|
||||
@@ -1128,19 +980,7 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count)
|
||||
Rect r = _focused_window->GetTextBoundingRect(start, end);
|
||||
NSRect view_rect = NSMakeRect(_focused_window->left + r.left, [ self frame ].size.height - _focused_window->top - r.bottom, r.right - r.left, r.bottom - r.top);
|
||||
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
||||
if ([ [ self window ] respondsToSelector:@selector(convertRectToScreen:) ]) {
|
||||
return [ [ self window ] convertRectToScreen:[ self convertRect:view_rect toView:nil ] ];
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7
|
||||
NSRect window_rect = [ self convertRect:view_rect toView:nil ];
|
||||
NSPoint origin = [ [ self window ] convertBaseToScreen:window_rect.origin ];
|
||||
return NSMakeRect(origin.x, origin.y, window_rect.size.width, window_rect.size.height);
|
||||
#else
|
||||
return NSMakeRect(0, 0, 0, 0);;
|
||||
#endif
|
||||
return [ [ self window ] convertRectToScreen:[ self convertRect:view_rect toView:nil ] ];
|
||||
}
|
||||
|
||||
/** Get the bounding rect for the given range. */
|
||||
@@ -1155,16 +995,6 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count)
|
||||
return [ NSArray array ];
|
||||
}
|
||||
|
||||
/** Identifier for this text input instance. */
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
|
||||
- (long)conversationIdentifier
|
||||
#else
|
||||
- (NSInteger)conversationIdentifier
|
||||
#endif
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Delete single character left of the cursor. */
|
||||
- (void)deleteBackward:(id)sender
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user