Mercurial > hg > openttd
changeset 7965:c4ef1371c850 draft
(svn r11521) -Codechange: [OSX] Check what the running os version is in a cleaner way.
author | egladil <egladil@openttd.org> |
---|---|
date | Sun, 25 Nov 2007 14:43:16 +0000 |
parents | 4d6fc5a6def7 |
children | 513c67153f34 |
files | src/music/qtmidi.cpp src/os/macosx/macos.h src/os/macosx/macos.mm src/sound/cocoa_s.cpp src/video/cocoa/cocoa_v.mm src/video/cocoa/event.mm src/video/cocoa/fullscreen.mm src/video/cocoa/wnd_quartz.mm src/video/cocoa/wnd_quickdraw.mm |
diffstat | 9 files changed, 153 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/music/qtmidi.cpp +++ b/src/music/qtmidi.cpp @@ -19,6 +19,9 @@ */ +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +#include <AvailabilityMacros.h> + /* * OpenTTD includes. */
--- a/src/os/macosx/macos.h +++ b/src/os/macosx/macos.h @@ -27,4 +27,44 @@ (__builtin_expect(!(e), 0) ? ShowMacAssertDialog ( __func__, __FILE__, __LINE__, #e ): (void)0 ) #endif + + +/** + * Get the major version of Mac OS we are running under. Useful for things like the cocoa driver. + * @return major version of the os. This would be 10 in the case of 10.4.11. + */ +long GetMacOSVersionMajor(); + +/** + * Get the minor version of Mac OS we are running under. Useful for things like the cocoa driver. + * @return minor version of the os. This would be 4 in the case of 10.4.11. + */ +long GetMacOSVersionMinor(); + +/** + * Get the bugfix version of Mac OS we are running under. Useful for things like the cocoa driver. + * @return bugfix version of the os. This would be 11 in the case of 10.4.11. + */ +long GetMacOSVersionBugfix(); + +/** + * Check if we are at least running on the specified version of Mac OS. + * @param major major version of the os. This would be 10 in the case of 10.4.11. + * @param minor minor version of the os. This would be 4 in the case of 10.4.11. + * @param bugfix bugfix version of the os. This would be 11 in the case of 10.4.11. + * @return true if the running os is at least what we asked, false otherwise. + */ +static inline bool MacOSVersionIsAtLeast(long major, long minor, long bugfix) +{ + long maj = GetMacOSVersionMajor(); + long min = GetMacOSVersionMinor(); + long bf = GetMacOSVersionBugfix(); + + if (maj < major) return false; + if (maj == major && min < minor) return false; + if (maj == major && min == minor && bf < bugfix) return false; + + return true; +} + #endif /* MACOS_H */
--- a/src/os/macosx/macos.mm +++ b/src/os/macosx/macos.mm @@ -1,5 +1,8 @@ /* $Id$ */ +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +#include <AvailabilityMacros.h> + #include <AppKit/AppKit.h> #include <mach/mach.h> @@ -168,6 +171,81 @@ NSArray* languages = [defs objectForKey:@"AppleLanguages"]; NSString* preferredLang = [languages objectAtIndex:0]; /* preferredLang is either 2 or 5 characters long ("xx" or "xx_YY"). */ - [ preferredLang getCString:retbuf maxLength:32 encoding:NSASCIIStringEncoding ]; + if (MacOSVersionIsAtLeast(10, 4, 0)) { + [ preferredLang getCString:retbuf maxLength:32 encoding:NSASCIIStringEncoding ]; + } else { + [ preferredLang getCString:retbuf maxLength:32 ]; + } return retbuf; } + + +/* + * This will only give an accurate result for versions before OS X 10.8 since it uses bcd encoding + * for the minor and bugfix version numbers and a scheme of representing all numbers from 9 and up + * with 9. This means we can't tell OS X 10.9 from 10.9 or 10.11. Please use GetMacOSVersionMajor() + * and GetMacOSVersionMinor() instead. + */ +static long GetMacOSVersion() +{ + static long sysVersion = -1; + + if (sysVersion != -1) return sysVersion; + + if (Gestalt(gestaltSystemVersion, &sysVersion) != noErr) sysVersion = -1; + return sysVersion; +} + +long GetMacOSVersionMajor() +{ + static long sysVersion = -1; + + if (sysVersion != -1) return sysVersion; + + sysVersion = GetMacOSVersion(); + if (sysVersion == -1) return -1; + + if (sysVersion >= 0x1040) { + if (Gestalt(gestaltSystemVersionMajor, &sysVersion) != noErr) sysVersion = -1; + } else { + sysVersion = GB(sysVersion, 12, 4) * 10 + GB(sysVersion, 8, 4); + } + + return sysVersion; +} + +long GetMacOSVersionMinor() +{ + static long sysVersion = -1; + + if (sysVersion != -1) return sysVersion; + + sysVersion = GetMacOSVersion(); + if (sysVersion == -1) return -1; + + if (sysVersion >= 0x1040) { + if (Gestalt(gestaltSystemVersionMinor, &sysVersion) != noErr) sysVersion = -1; + } else { + sysVersion = GB(sysVersion, 4, 4); + } + + return sysVersion; +} + +long GetMacOSVersionBugfix() +{ + static long sysVersion = -1; + + if (sysVersion != -1) return sysVersion; + + sysVersion = GetMacOSVersion(); + if (sysVersion == -1) return -1; + + if (sysVersion >= 0x1040) { + if (Gestalt(gestaltSystemVersionBugFix, &sysVersion) != noErr) sysVersion = -1; + } else { + sysVersion = GB(sysVersion, 0, 4); + } + + return sysVersion; +}
--- a/src/sound/cocoa_s.cpp +++ b/src/sound/cocoa_s.cpp @@ -8,6 +8,9 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +#include <AvailabilityMacros.h> + #include <AudioUnit/AudioUnit.h> /* Name conflict */
--- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -8,6 +8,7 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 #include <AvailabilityMacros.h> #import <Cocoa/Cocoa.h> @@ -229,13 +230,17 @@ static CocoaSubdriver *QZ_CreateWindowSubdriver(int width, int height, int bpp) { - long sysVersion; + CocoaSubdriver *ret; - if (Gestalt(gestaltSystemVersion, &sysVersion) == noErr && sysVersion >= 0x1040) { - return QZ_CreateWindowQuartzSubdriver(width, height, bpp); + if (MacOSVersionIsAtLeast(10, 4, 0)) { + ret = QZ_CreateWindowQuartzSubdriver(width, height, bpp); + if (ret != NULL) return ret; } - return QZ_CreateWindowQuickdrawSubdriver(width, height, bpp); + ret = QZ_CreateWindowQuickdrawSubdriver(width, height, bpp); + if (ret != NULL) return ret; + + return NULL; } @@ -282,6 +287,8 @@ { int width, height, bpp; + if (!MacOSVersionIsAtLeast(10, 3, 0)) return "The Cocoa video driver requires Mac OS X 10.3 or later."; + if (_cocoa_video_started) return "Already started"; _cocoa_video_started = true;
--- a/src/video/cocoa/event.mm +++ b/src/video/cocoa/event.mm @@ -8,6 +8,9 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +#include <AvailabilityMacros.h> + #import <Cocoa/Cocoa.h> #import <sys/time.h> /* gettimeofday */ #import <sys/param.h> /* for MAXPATHLEN */
--- a/src/video/cocoa/fullscreen.mm +++ b/src/video/cocoa/fullscreen.mm @@ -8,6 +8,7 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 #include <AvailabilityMacros.h> #import <Cocoa/Cocoa.h>
--- a/src/video/cocoa/wnd_quartz.mm +++ b/src/video/cocoa/wnd_quartz.mm @@ -8,6 +8,7 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_4 #include <AvailabilityMacros.h> #import <Cocoa/Cocoa.h> @@ -685,6 +686,7 @@ p->y = window_height - p->y; *p = [ qzview convertPoint:*p toView: nil ]; + *p = [ window convertBaseToScreen:*p ]; p->y = device_height - p->y; @@ -779,6 +781,11 @@ { WindowQuartzSubdriver *ret; + if (!MacOSVersionIsAtLeast(10, 4, 0)) { + DEBUG(driver, 0, "The cocoa quartz subdriver requires Mac OS X 10.4 or later."); + return NULL; + } + if (bpp != 8 && bpp != 32) { DEBUG(driver, 0, "The cocoa quartz subdriver only supports 8 and 32 bpp."); return NULL;
--- a/src/video/cocoa/wnd_quickdraw.mm +++ b/src/video/cocoa/wnd_quickdraw.mm @@ -8,6 +8,8 @@ #ifdef WITH_COCOA +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +#define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_3 #include <AvailabilityMacros.h> #import <Cocoa/Cocoa.h> @@ -796,6 +798,10 @@ { WindowQuickdrawSubdriver *ret; + if (MacOSVersionIsAtLeast(10, 4, 0)) { + DEBUG(driver, 0, "The cocoa quickdraw subdriver is not recommended for Mac OS X 10.4 or later."); + } + if (bpp != 8 && bpp != 32) { DEBUG(driver, 0, "The cocoa quickdraw subdriver only supports 8 and 32 bpp."); return NULL;