Mercurial > sdl-ios-xcode
diff src/main/macosx/SDLMain.m @ 221:50620ec9c86a
*** empty log message ***
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 02 Nov 2001 18:12:52 +0000 |
parents | ba9e0fcc2ae2 |
children | 4e9044b378fd |
line wrap: on
line diff
--- a/src/main/macosx/SDLMain.m Thu Nov 01 16:45:40 2001 +0000 +++ b/src/main/macosx/SDLMain.m Fri Nov 02 18:12:52 2001 +0000 @@ -1,5 +1,6 @@ /* SDLMain.m - main entry point for our Cocoa-ized SDL app - Darrell Walisser - dwaliss1@purdue.edu + Initial Version: Darrell Walisser <dwaliss1@purdue.edu> + Non-NIB-Code & other changes: Max Horn <max@quendi.de> Feel free to customize this file to suit your needs */ @@ -9,33 +10,44 @@ #import <sys/param.h> /* for MAXPATHLEN */ #import <unistd.h> +/* Use this flag to determine whether we use SDLMain.nib or not */ +#define SDL_USE_NIB_FILE 0 + + static int gArgc; static char **gArgv; -static NSString *gAppName = 0; static BOOL gFinderLaunch; +#if SDL_USE_NIB_FILE +/* A helper category for NSString */ @interface NSString (ReplaceSubString) - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; @end +#else +/* An internal Apple class used to setup Apple menus */ +@interface NSAppleMenuController:NSObject {} +- (void)controlMenu:(NSMenu *)aMenu; +@end +#endif + +@interface SDLApplication : NSApplication +@end + +@implementation SDLApplication +/* Invoked from the Quit menu item */ +- (void)terminate:(id)sender +{ + /* Post a SDL_QUIT event */ + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); +} +@end /* The main class of the application, the application's delegate */ @implementation SDLMain -/* Invoked from the Quit menu item */ -- (void) quit:(id)sender -{ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} - -/* Invoked from the Make Full-Screen menu item */ -- (void) makeFullscreen:(id)sender -{ - /* TODO */ -} - /* Set the working directory to the .app's parent directory */ - (void) setupWorkingDirectory:(BOOL)shouldChdir { @@ -58,11 +70,12 @@ assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */ assert ( chdir ("../../../") == 0 ); /* chdir to the .app's parent */ } - /* gAppName = [ NSString stringWithCString: c ]; */ } +#if SDL_USE_NIB_FILE + /* Fix menu to contain the real app name instead of "SDL App" */ -- (void) fixMenu:(NSMenu *)aMenu +- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName { NSRange aRange; NSEnumerator *enumerator; @@ -70,31 +83,114 @@ aRange = [[aMenu title] rangeOfString:@"SDL App"]; if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:gAppName]]; + [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; enumerator = [[aMenu itemArray] objectEnumerator]; while ((menuItem = [enumerator nextObject])) { aRange = [[menuItem title] rangeOfString:@"SDL App"]; if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:gAppName]]; + [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; if ([menuItem hasSubmenu]) - [self fixMenu: [menuItem submenu]]; + [self fixMenu:[menuItem submenu] withAppName:appName]; } [ aMenu sizeToFit ]; } +#else + +void setupAppleMenu(void) +{ + /* warning: this code is very odd */ + NSAppleMenuController *appleMenuController; + NSMenu *appleMenu; + NSMenuItem *appleMenuItem; + + appleMenuController = [[NSAppleMenuController alloc] init]; + appleMenu = [[NSMenu alloc] initWithTitle:@""]; + appleMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + + [appleMenuItem setSubmenu:appleMenu]; + + /* yes, we do need to add it and then remove it -- + if you don't add it, it doesn't get displayed + if you don't remove it, you have an extra, titleless item in the menubar + when you remove it, it appears to stick around + very, very odd */ + [[NSApp mainMenu] addItem:appleMenuItem]; + [appleMenuController controlMenu:appleMenu]; + [[NSApp mainMenu] removeItem:appleMenuItem]; + [appleMenu release]; + [appleMenuItem release]; +} + +/* Create a window menu */ +void setupWindowMenu(void) +{ + NSMenu *windowMenu; + NSMenuItem *windowMenuItem; + NSMenuItem *menuItem; + + + windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; + + /* "Minimize" item */ + menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; + [windowMenu addItem:menuItem]; + [menuItem release]; + + /* Put menu into the menubar */ + windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; + [windowMenuItem setSubmenu:windowMenu]; + [[NSApp mainMenu] addItem:windowMenuItem]; + + /* Tell the application object that this is now the window menu */ + [NSApp setWindowsMenu:windowMenu]; + + /* Finally give up our references to the objects */ + [windowMenu release]; + [windowMenuItem release]; +} + +/* Replacement for NSApplicationMain */ +void CustomApplicationMain (argc, argv) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + SDLMain *sdlMain; + + /* Ensure the application object is initialised */ + [SDLApplication sharedApplication]; + + /* Set up the menubar */ + [NSApp setMainMenu:[[NSMenu alloc] init]]; + setupAppleMenu(); + setupWindowMenu(); + + /* Create SDLMain and make it the app delegate */ + sdlMain = [[SDLMain alloc] init]; + [NSApp setDelegate:sdlMain]; + + /* Start the main event loop */ + [NSApp run]; + + [sdlMain release]; + [pool release]; +} + +#endif + /* Called when the internal event loop has just started running */ - (void) applicationDidFinishLaunching: (NSNotification *) note { int status; /* Set the working directory to the .app's parent directory */ - [ self setupWorkingDirectory: gFinderLaunch ]; + [self setupWorkingDirectory:gFinderLaunch]; +#if SDL_USE_NIB_FILE /* Set the main menu to contain the real app name instead of "SDL App" */ - gAppName = [ [ NSBundle mainBundle ] bundleIdentifier ]; - [ self fixMenu: [ NSApp mainMenu ] ]; + [self fixMenu:[NSApp mainMenu] withAppName:[[NSProcessInfo processInfo] processName]]; +#endif /* Hand off to main application code */ status = SDL_main (gArgc, gArgv); @@ -119,22 +215,22 @@ bufferSize = selfLen + aStringLen - aRange.length; buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - // Get first part into buffer + /* Get first part into buffer */ localRange.location = 0; localRange.length = aRange.location; [self getCharacters:buffer range:localRange]; - // Get middle part into buffer + /* Get middle part into buffer */ localRange.location = 0; localRange.length = aStringLen; [aString getCharacters:(buffer+aRange.location) range:localRange]; - // Get last part into buffer + /* Get last part into buffer */ localRange.location = aRange.location + aRange.length; localRange.length = selfLen - localRange.location; [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - // Build output string + /* Build output string */ result = [NSString stringWithCharacters:buffer length:bufferSize]; NSDeallocateMemoryPages(buffer, bufferSize); @@ -145,12 +241,15 @@ @end + #ifdef main # undef main #endif -/* Main entry point to executible - should *not* be SDL_main! */ -int main (int argc, char **argv) { + +/* Main entry point to executable - should *not* be SDL_main! */ +int main (int argc, char **argv) +{ /* Copy the arguments into a global variable */ int i; @@ -165,11 +264,15 @@ } gArgv = (char**) malloc (sizeof(*gArgv) * (gArgc+1)); assert (gArgv != NULL); - for (i = 0; i < gArgc; i++) { + for (i = 0; i < gArgc; i++) gArgv[i] = argv[i]; - } gArgv[i] = NULL; +#if SDL_USE_NIB_FILE + [SDLApplication poseAsClass:[NSApplication class]]; NSApplicationMain (argc, argv); +#else + CustomApplicationMain (argc, argv); +#endif return 0; }