Mercurial > sdl-ios-xcode
diff src/main/macosx/SDLMain.m @ 158:4382c38dfbee
Date: Tue, 21 Aug 2001 03:50:01 +0200
From: Max Horn <max@quendi.de>
Subject: New patch for OS X
Attached a .patch file for SDL/OSX with some nice bug fixes / enhancments.
* fixes the activation issues, which also caused the window to be
always drawn like an inactive. The close/minimize widgets now are
animated properly, too.
* the menu items are automatically adjusted to use the app name
instead of just "SDL App". I did this so that we really can use one
central SDLMain.nib file, w/o requiring developers to make a copy of
it and adjust it.
* libSDLMain now contains the proper cocoa code, not as before the
carbon code. This means apps no longer have to carry a copy of
SDLMain.m/SDLMain.h
* revamped configure.in to properly build a Cocoa/Quartz SDL lib, not
a Carbon based SDL lib
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 21 Aug 2001 07:19:59 +0000 |
parents | bd6b0a910a65 |
children | e92aa316c517 |
line wrap: on
line diff
--- a/src/main/macosx/SDLMain.m Mon Aug 20 04:41:49 2001 +0000 +++ b/src/main/macosx/SDLMain.m Tue Aug 21 07:19:59 2001 +0000 @@ -11,6 +11,12 @@ static int gArgc; static char **gArgv; +static NSString *gAppName = 0; + +@interface NSString (ReplaceSubString) +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; +@end + /* The main class of the application, the application's delegate */ @implementation SDLMain @@ -18,9 +24,9 @@ /* Invoked from the Quit menu item */ - (void) quit:(id)sender { - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); } /* Set the working directory to the .app's parent directory */ @@ -29,7 +35,7 @@ char parentdir[MAXPATHLEN]; char *c; - strncpy ( parentdir, gArgv[0], MAXPATHLEN ); + strncpy ( parentdir, gArgv[0], sizeof(parentdir) ); c = (char*) parentdir; while (*c != '\0') /* go to end */ @@ -38,10 +44,35 @@ while (*c != '/') /* back up to parent */ c--; - *c = '\0'; /* cut off last part (binary name) */ + *c++ = '\0'; /* cut off last part (binary name) */ assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */ assert ( chdir ("../../../") == 0 ); /* chdir to the .app's parent */ + + gAppName = [ NSString stringWithCString: c ]; +} + +/* Fix menu to contain the real app name instead of "SDL App" */ +- (void) fixMenu:(NSMenu *)aMenu +{ + NSRange aRange; + NSEnumerator *enumerator; + NSMenuItem *menuItem; + + aRange = [[aMenu title] rangeOfString:@"SDL App"]; + if (aRange.length != 0) + [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:gAppName]]; + + 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]]; + if ([menuItem hasSubmenu]) + [self fixMenu: [menuItem submenu]]; + } + [ aMenu sizeToFit ]; } /* Called when the internal event loop has just started running */ @@ -52,6 +83,9 @@ /* Set the working directory to the .app's parent directory */ [ self setupWorkingDirectory ]; + /* Set the main menu to contain the real app name instead of "SDL App" */ + [ self fixMenu: [ NSApp mainMenu ] ]; + /* Hand off to main application code */ status = SDL_main (gArgc, gArgv); @@ -60,6 +94,47 @@ } @end + +@implementation NSString (ReplaceSubString) + +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString +{ + unsigned int bufferSize; + unsigned int selfLen = [self length]; + unsigned int aStringLen = [aString length]; + unichar *buffer; + NSRange localRange; + NSString *result; + + bufferSize = selfLen + aStringLen - aRange.length; + buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar)); + + // Get first part into buffer + localRange.location = 0; + localRange.length = aRange.location; + [self getCharacters:buffer range:localRange]; + + // Get middle part into buffer + localRange.location = 0; + localRange.length = aStringLen; + [aString getCharacters:(buffer+aRange.location) range:localRange]; + + // 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 + result = [NSString stringWithCharacters:buffer length:bufferSize]; + + NSDeallocateMemoryPages(buffer, bufferSize); + + return result; +} + +@end + + #ifdef main # undef main #endif