# HG changeset patch # User Sam Lantinga # Date 1001277720 0 # Node ID c151cfc43c07f091dcf042fe17d1a401468cddab # Parent e4af2c852c09dff1bf4b936fff85b74312315118 Changed SDLMain to SDL_main for MacOS X stuff diff -r e4af2c852c09 -r c151cfc43c07 PBProjects.tar.gz Binary file PBProjects.tar.gz has changed diff -r e4af2c852c09 -r c151cfc43c07 README.MacOSX --- a/README.MacOSX Sun Sep 23 18:19:44 2001 +0000 +++ b/README.MacOSX Sun Sep 23 20:42:00 2001 +0000 @@ -51,7 +51,7 @@ tasks when used on MacOS X Rationale: AM_PATH_SDL copies /usr/local/share/sdl/Info.plist and the folder - /usr/local/share/sdl/SDLMain.nib/ into the directory where configure is invoked. + /usr/local/share/sdl/SDL_main.nib/ into the directory where configure is invoked. This is essential for the configure script to be able to run the test code that detects SDL. @@ -68,10 +68,10 @@ APP_NAME.app: EXE_NAME mkdir -p $@/Contents/MacOS mkdir -p $@/Contents/Resources - mkdir -p $@/Contents/Resources/SDLMain.nib + mkdir -p $@/Contents/Resources/SDL_main.nib echo "APPL????" > $@/Contents/PkgInfo $(INSTALL_DATA) Info.plist $@/Contents/ - $(INSTALL_DATA) SDLMain.nib/*.nib $@/Contents/Resources/ + $(INSTALL_DATA) SDL_main.nib/*.nib $@/Contents/Resources/ $(INSTALL_PROGRAM) $< $@/Contents/MacOS/ You should replace EXE_NAME with the name of the executable. APP_NAME is what @@ -153,13 +153,13 @@ - Setting up a new project by hand Some of you won't want to use the Stationary so I'll give some tips: * Create a new "Cocoa Application" - * Add src/main/macosx/SDLMain.m , .h and .nib to your project + * Add src/main/macosx/SDL_main.m , .h and .nib to your project * Remove "main.c" from your project * Remove "MainMenu.nib" from your project * Add "$(HOME)/Library/Frameworks/SDL.framework/Headers" to include path * Add "$(HOME)/Library/Frameworks" to the frameworks search path * Add "-framework SDL" to the "OTHER_LDFLAGS" variable - * Set the "Main Nib File" under "Application Settings" to "SDLMain.nib" + * Set the "Main Nib File" under "Application Settings" to "SDL_main.nib" * Add your files * Clean and build @@ -174,7 +174,7 @@ - Implementation Notes Some things that may be of interest about how it all works... * Working directory - As defined in the SDLMain.m file, the working directory of your SDL app + As defined in the SDL_main.m file, the working directory of your SDL app is by default set to its parent. You may wish to change this to better suit your needs. * You have a Cocoa App! diff -r e4af2c852c09 -r c151cfc43c07 configure.in --- a/configure.in Sun Sep 23 18:19:44 2001 +0000 +++ b/configure.in Sun Sep 23 20:42:00 2001 +0000 @@ -1379,13 +1379,12 @@ CDROM_DRIVERS="$CDROM_DRIVERS bsdi/libcdrom_bsdi.la" fi # Set up files for the thread library - SDL_LIBS="$SDL_LIBS -lsem" if test x$enable_threads = xyes; then COPY_ARCH_SRC(src/thread, linux, SDL_systhread.c) COPY_ARCH_SRC(src/thread, linux, SDL_systhread_c.h) COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex.c) COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex_c.h) - COPY_ARCH_SRC(src/thread, linux, SDL_syssem.c) + COPY_ARCH_SRC(src/thread, bsdi, SDL_syssem.c) COPY_ARCH_SRC(src/thread, generic, SDL_syssem_c.h) COPY_ARCH_SRC(src/thread, linux, SDL_syscond.c) COPY_ARCH_SRC(src/thread, generic, SDL_syscond_c.h) @@ -2074,8 +2073,8 @@ CheckMacGL CheckPTHREAD # Set up files for the main() stub - COPY_ARCH_SRC(src/main, macosx, SDLmain.m) - COPY_ARCH_SRC(src/main, macosx, SDLmain.h) + COPY_ARCH_SRC(src/main, macosx, SDL_main.m) + COPY_ARCH_SRC(src/main, macosx, SDL_main.h) # Set up files for the audio library if test x$enable_audio = xyes; then AUDIO_SUBDIRS="$AUDIO_SUBDIRS macrom" diff -r e4af2c852c09 -r c151cfc43c07 sdl-config.in --- a/sdl-config.in Sun Sep 23 18:19:44 2001 +0000 +++ b/sdl-config.in Sun Sep 23 20:42:00 2001 +0000 @@ -57,7 +57,7 @@ @ENABLE_STATIC_TRUE@ echo $libdirs @SDL_LIBS@ @SYSTEM_LIBS@ @ENABLE_STATIC_TRUE@ ;; @TARGET_MACOSX_TRUE@ --nib) -@TARGET_MACOSX_TRUE@ echo @datadir@/sdl/SDLMain.nib +@TARGET_MACOSX_TRUE@ echo @datadir@/sdl/SDL_main.nib @TARGET_MACOSX_TRUE@ ;; @TARGET_MACOSX_TRUE@ --plist) @TARGET_MACOSX_TRUE@ echo @datadir@/sdl/Info.plist diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/Info.plist.in --- a/src/main/macosx/Info.plist.in Sun Sep 23 18:19:44 2001 +0000 +++ b/src/main/macosx/Info.plist.in Sun Sep 23 20:42:00 2001 +0000 @@ -17,7 +17,7 @@ CFBundleSignature ???? NSMainNibFile - SDLMain.nib + SDL_main.nib NSPrincipalClass NSApplication diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/Makefile.am --- a/src/main/macosx/Makefile.am Sun Sep 23 18:19:44 2001 +0000 +++ b/src/main/macosx/Makefile.am Sun Sep 23 20:42:00 2001 +0000 @@ -1,27 +1,27 @@ -# On OS X, install the SDLMain.nib. +# On OS X, install the SDL_main.nib. # We use an ugly hack to force the creation of the # destination dir, maybe somebody with more automake # experience knows how to do this properly? if TARGET_MACOSX -masternibdatadir = $(datadir)/sdl/SDLMain.nib +masternibdatadir = $(datadir)/sdl/SDL_main.nib masternibdata_DATA = \ - SDLMain.nib + SDL_main.nib nibdatadir = $(datadir)/sdl nibdata_DATA = \ - SDLMain.nib/classes.nib \ - SDLMain.nib/info.nib \ - SDLMain.nib/objects.nib \ + SDL_main.nib/classes.nib \ + SDL_main.nib/info.nib \ + SDL_main.nib/objects.nib \ Info.plist endif -EXTRA_DIST = SDLMain.h SDLMain.m +EXTRA_DIST = SDL_main.h SDL_main.m # The nib and exports directories need to be copied into place # when building a distribution. dist-hook: (cd $(distdir) && rm -f $(BUILT_SOURCES)) - cp -rp SDLMain.nib $(distdir) + cp -rp SDL_main.nib $(distdir) cp -rp exports $(distdir) (cd $(distdir) && rm -rf `find . -name CVS`) diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/SDLMain.h --- a/src/main/macosx/SDLMain.h Sun Sep 23 18:19:44 2001 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -/* SDLMain.h - main entry point for our Cocoa-ized SDL app - Darrell Walisser - dwaliss1@purdue.edu - - Feel free to customize this file to suit your needs -*/ - -#import - -@interface SDLMain : NSObject -{ -} -- (IBAction)quit:(id)sender; -- (IBAction)makeFullscreen:(id)sender; -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; -@end diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/SDLMain.m --- a/src/main/macosx/SDLMain.m Sun Sep 23 18:19:44 2001 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Darrell Walisser - dwaliss1@purdue.edu - - Feel free to customize this file to suit your needs -*/ - -#import "SDL.h" -#import "SDLMain.h" -#import /* for MAXPATHLEN */ -#import - -static int gArgc; -static char **gArgv; -static NSString *gAppName = 0; -static BOOL gFinderLaunch; - -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@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 -{ - char parentdir[MAXPATHLEN]; - char *c; - - strncpy ( parentdir, gArgv[0], sizeof(parentdir) ); - c = (char*) parentdir; - - while (*c != '\0') /* go to end */ - c++; - - while (*c != '/') /* back up to parent */ - c--; - - *c++ = '\0'; /* cut off last part (binary name) */ - - if (shouldChdir) - { - 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 */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [ self setupWorkingDirectory: gFinderLaunch ]; - - /* Set the main menu to contain the real app name instead of "SDL App" */ - gAppName = [ [ NSBundle mainBundle ] bundleIdentifier ]; - [ self fixMenu: [ NSApp mainMenu ] ]; - - /* Hand off to main application code */ - status = SDL_main (gArgc, gArgv); - - /* We're done, thank you for playing */ - exit(status); -} -@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 - -/* Main entry point to executible - should *not* be SDL_main! */ -int main (int argc, char **argv) { - - /* Copy the arguments into a global variable */ - int i; - - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgc = 1; - gFinderLaunch = YES; - } else { - gArgc = argc; - gFinderLaunch = NO; - } - gArgv = (char**) malloc (sizeof(*gArgv) * (gArgc+1)); - assert (gArgv != NULL); - for (i = 0; i < gArgc; i++) { - gArgv[i] = argv[i]; - } - gArgv[i] = NULL; - - NSApplicationMain (argc, argv); - return 0; -} diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/SDLMain.nib/classes.nib --- a/src/main/macosx/SDLMain.nib/classes.nib Sun Sep 23 18:19:44 2001 +0000 +++ b/src/main/macosx/SDLMain.nib/classes.nib Sun Sep 23 20:42:00 2001 +0000 @@ -3,10 +3,10 @@ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {makeFullscreen = id; quit = id; }; - CLASS = SDLMain; + CLASS = SDL_main; LANGUAGE = ObjC; SUPERCLASS = NSObject; } ); IBVersion = 1; -} \ No newline at end of file +} diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/SDL_main.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/macosx/SDL_main.h Sun Sep 23 20:42:00 2001 +0000 @@ -0,0 +1,15 @@ +/* SDL_main.h - main entry point for our Cocoa-ized SDL app + Darrell Walisser - dwaliss1@purdue.edu + + Feel free to customize this file to suit your needs +*/ + +#import + +@interface SDL_main : NSObject +{ +} +- (IBAction)quit:(id)sender; +- (IBAction)makeFullscreen:(id)sender; +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; +@end diff -r e4af2c852c09 -r c151cfc43c07 src/main/macosx/SDL_main.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/macosx/SDL_main.m Sun Sep 23 20:42:00 2001 +0000 @@ -0,0 +1,175 @@ +/* SDL_main.m - main entry point for our Cocoa-ized SDL app + Darrell Walisser - dwaliss1@purdue.edu + + Feel free to customize this file to suit your needs +*/ + +#import "SDL.h" +#import "SDL_main.h" +#import /* for MAXPATHLEN */ +#import + +static int gArgc; +static char **gArgv; +static NSString *gAppName = 0; +static BOOL gFinderLaunch; + +@interface NSString (ReplaceSubString) +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; +@end + + +/* The main class of the application, the application's delegate */ +@implementation SDL_main + +/* 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 +{ + char parentdir[MAXPATHLEN]; + char *c; + + strncpy ( parentdir, gArgv[0], sizeof(parentdir) ); + c = (char*) parentdir; + + while (*c != '\0') /* go to end */ + c++; + + while (*c != '/') /* back up to parent */ + c--; + + *c++ = '\0'; /* cut off last part (binary name) */ + + if (shouldChdir) + { + 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 */ +- (void) applicationDidFinishLaunching: (NSNotification *) note +{ + int status; + + /* Set the working directory to the .app's parent directory */ + [ self setupWorkingDirectory: gFinderLaunch ]; + + /* Set the main menu to contain the real app name instead of "SDL App" */ + gAppName = [ [ NSBundle mainBundle ] bundleIdentifier ]; + [ self fixMenu: [ NSApp mainMenu ] ]; + + /* Hand off to main application code */ + status = SDL_main (gArgc, gArgv); + + /* We're done, thank you for playing */ + exit(status); +} +@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 + +/* Main entry point to executible - should *not* be SDL_main! */ +int main (int argc, char **argv) { + + /* Copy the arguments into a global variable */ + int i; + + /* This is passed if we are launched by double-clicking */ + if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { + gArgc = 1; + gFinderLaunch = YES; + } else { + gArgc = argc; + gFinderLaunch = NO; + } + gArgv = (char**) malloc (sizeof(*gArgv) * (gArgc+1)); + assert (gArgv != NULL); + for (i = 0; i < gArgc; i++) { + gArgv[i] = argv[i]; + } + gArgv[i] = NULL; + + NSApplicationMain (argc, argv); + return 0; +}