diff options
-rw-r--r-- | os/macosx/macos.h | 9 | ||||
-rw-r--r-- | os/macosx/macos.m | 105 |
2 files changed, 112 insertions, 2 deletions
diff --git a/os/macosx/macos.h b/os/macosx/macos.h index ac1780112..bec5149be 100644 --- a/os/macosx/macos.h +++ b/os/macosx/macos.h @@ -3,8 +3,17 @@ #ifndef MACOS_H #define MACOS_H +/* + * Functions to show the popup window + * use ShowMacDialog when you want to control title, message and text on the button + * ShowMacAssertDialog is used by assert + * ShowMacErrorDialog should be used when an unrecoverable error shows up. It only contains the title, which will should tell what went wrong + * the function then adds text that tells the user to update and then report the bug if it's present in the newest version + * It also quits in a nice way since we call it when we know something happened that will crash OpenTTD (like a needed pointer turns out to be NULL or similar) + */ void ShowMacDialog ( const char *title, const char *message, const char *buttonLabel ); void ShowMacAssertDialog ( const char *function, const char *file, const int line, const char *expression ); +void ShowMacErrorDialog(const char *error); // Since MacOS X users will never see an assert unless they started the game from a terminal // we're using a custom assert(e) macro. diff --git a/os/macosx/macos.m b/os/macosx/macos.m index c09e58de1..5ac2c4922 100644 --- a/os/macosx/macos.m +++ b/os/macosx/macos.m @@ -2,6 +2,20 @@ #include <AppKit/AppKit.h> +#include <mach/mach.h> +#include <mach/mach_host.h> +#include <mach/host_info.h> +#include <mach/machine.h> +#include <stdio.h> +#include "../../stdafx.h" +#include "../../openttd.h" +#include "../../newgrf.h" +#include "../../gfx.h" + +#ifndef CPU_SUBTYPE_POWERPC_970 +#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) +#endif + /* * This file contains objective C * Apple uses objective C instead of plain C to interact with OS specific/native functions @@ -10,6 +24,82 @@ * To insure that the crosscompiler still works, let him try any changes before they are committed */ +static char *GetOSString(void) +{ + static char buffer[175]; + char CPU[20]; + char OS[20]; + char newgrf[125]; + long sysVersion; + extern const char _openttd_revision[]; + + + // get the hardware info + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, + (host_info_t)&hostInfo, &infoCount); + + // replace the hardware info with strings, that tells a bit more than just an int +#ifdef __POWERPC__ + switch (hostInfo.cpu_subtype) { + case CPU_SUBTYPE_POWERPC_750: + sprintf(CPU,"G3"); + break; + case CPU_SUBTYPE_POWERPC_7400: + case CPU_SUBTYPE_POWERPC_7450: + sprintf(CPU,"G4"); + break; + case CPU_SUBTYPE_POWERPC_970: + sprintf(CPU,"G5"); + break; + default: + sprintf(CPU,"Unknown PPC"); + } +#else + // it looks odd to have a switch for two cases, but it leaves room for easy expansion. Odds are that Apple will some day use newer CPUs than i686 + switch (hostInfo.cpu_subtype) { + case CPU_SUBTYPE_PENTPRO: + sprintf(CPU,"i686"); + break; + default: + sprintf(CPU,"Unknown Intel"); + } +#endif + + // get the version of OSX + if( Gestalt( gestaltSystemVersion, &sysVersion ) != noErr ) { + sprintf(OS,"Undetected"); + } else { + + int majorHiNib, majorLoNib, minorNib, bugNib; + + majorHiNib = (sysVersion & 0x0000F000) >> 12; + majorLoNib = (sysVersion & 0x00000F00) >> 8; + minorNib = (sysVersion & 0x000000F0) >> 4; + bugNib = sysVersion & 0x0000000F; + + sprintf(OS, "%d%d.%d.%d", majorHiNib, majorLoNib, minorNib, bugNib); + } + + // make a list of used newgrf files + if (_first_grffile != NULL) { + GRFFile *file; + newgrf[0] = 0; + + + for (file = _first_grffile; file != NULL; file = file->next) { + sprintf(newgrf, "%s %s", newgrf, file->filename); + } + } else { + sprintf(newgrf, "none"); + } + sprintf(buffer, "Please add this info: (tip: copy-paste works)\nCPU: %s, OSX: %s, OpenTTD version: %s\nNewGRF files:%s", CPU, OS, _openttd_revision, newgrf); + return buffer; +} + #ifdef WITH_SDL @@ -40,11 +130,22 @@ void ShowMacDialog ( const char *title, const char *message, const char *buttonL void ShowMacAssertDialog ( const char *function, const char *file, const int line, const char *expression ) { const char *buffer = - [[NSString stringWithFormat:@"An assertion has failed and OpenTTD must quit.\n%s in %s (line %d)\n\"%s\"\n\nYou should report this error the OpenTTD developers if you think you found a bug.", - function, file, line, expression] cString]; + [[NSString stringWithFormat:@"An assertion has failed and OpenTTD must quit.\n%s in %s (line %d)\n\"%s\"\n\nYou should report this error the OpenTTD developers if you think you found a bug.\n\n%s", + function, file, line, expression, GetOSString()] cString]; NSLog(@"%s", buffer); + ToggleFullScreen(0); ShowMacDialog( "Assertion Failed", buffer, "Quit" ); // abort so that a debugger has a chance to notice abort(); } + + +void ShowMacErrorDialog(const char *error) +{ + const char *buffer = + [[NSString stringWithFormat:@"Please update to the newest version of OpenTTD\nIf the problem presists, please report this to\nhttp://bugs.openttd.org\n\n%s", GetOSString()] cString]; + ToggleFullScreen(0); + ShowMacDialog(error, buffer, "Quit" ); + abort(); +} |