// lancher.m // // Copyright (C) 2006 David J. Goehrig // // // Define _SDL_main_h to avoid using SDLMain.m #define _SDL_main_h #include #include #include #include #include #include "launcher.h" static SDLPerlMain* sdlplmain; static PerlInterpreter *my_perl = NULL; char path[MAXPATHLEN]; char libpath[MAXPATHLEN]; char scriptfile[MAXPATHLEN]; BOOL init_path; void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; sprintf(libpath,"%s/Contents/Resources/lib/%s",path,ARCHNAME); fprintf(stderr,"LIBPATH: %s\n",libpath); dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); SV* svpth = newSVpv(libpath,strlen(libpath)); AV* inc = get_av("INC",0); if (inc && svpth) { av_unshift(inc,1); av_store(inc,0,svpth); } } @implementation SDLPerlApplication - (void) terminate:(id)sender { fprintf(stderr,"Quitting Event\n"); SDL_Event event; event.type = SDL_QUIT; SDL_PushEvent(&event); [NSApp stop: nil]; } @end @implementation SDLPerlMain - (void) setupWorkingDirectory:(BOOL)changep { CFURLRef bpath; fprintf(stderr,"Setup working directory ? %s", (changep ? "True" : "False")); if (! changep) return; bpath = CFBundleCopyBundleURL(CFBundleGetMainBundle()); if (CFURLGetFileSystemRepresentation(bpath,true,(UInt8*)path,MAXPATHLEN)) { fprintf(stderr,"PATH: %s\n",path); chdir((char*)path); } } - (void) applicationWillFinishLaunching: (NSNotification *) note { NSMenu* appleMenu; NSMenuItem* item; NSDictionary* dict; NSString* appName; NSString* title; fprintf(stderr, "Application will finish launching\n"); dict = (NSDictionary*)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); appName = (dict ? [dict objectForKey: @"CFBundleName"] : [[NSProcessInfo processInfo] processName]); appleMenu = [[NSMenu alloc] initWithTitle: @""]; title = [@"About " stringByAppendingString: appName ]; [appleMenu addItemWithTitle: title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appleMenu addItem: [NSMenuItem separatorItem]]; title = [@"Hide " stringByAppendingString: appName ]; [appleMenu addItemWithTitle: title action:@selector(hide:) keyEquivalent:@"h"]; title = @"Hide Others"; [appleMenu addItemWithTitle: title action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; title = @"Show All"; [appleMenu addItemWithTitle: title action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appleMenu addItem: [NSMenuItem separatorItem]]; title = @"Quit"; [appleMenu addItemWithTitle: title action:@selector(terminate:) keyEquivalent:@"q"]; item = [[NSMenuItem alloc] initWithTitle:@"" action: nil keyEquivalent:@""]; [item setSubmenu: appleMenu]; [[NSApp mainMenu] addItem: item]; [NSApp setMainMenu: appleMenu]; fprintf(stderr,"Done with menu\n"); } - (void) applicationDidFinishLaunching: (NSNotification *) note { fprintf(stderr, "Application did finish launching\n"); // fprintf(stderr, "SCRIPT: %s\n",scriptfile); // NSString* scr = [[NSString alloc] initWithUTF8String: scriptfile]; // fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false"); // [self setupWorkingDirectory: init_path]; // fprintf(stderr,"Launching perl script %s\n", scriptfile); // [self launchPerl: scr ]; [NSApp terminate: self]; } - (void) launchPerl: (NSString*) script { int count = 3; char* embedding[] = { path, scriptfile , "0" } ; unsigned buflen = [ script lengthOfBytesUsingEncoding: NSUTF8StringEncoding] + 1; [script getCString:scriptfile maxLength: buflen encoding:NSUTF8StringEncoding]; fprintf(stderr,"Launching script: %s\n",scriptfile); PERL_SYS_INIT3(&count,&embedding,NULL); my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl,xs_init,count,embedding,NULL); fprintf(stderr,"Running perl\n"); perl_run(my_perl); fprintf(stderr,"Destructing perl\n"); perl_destruct(my_perl); fprintf(stderr,"Freeing perl\n"); perl_free(my_perl); fprintf(stderr,"Quiting perl script: %s\n",scriptfile); PERL_SYS_TERM(); } - (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename { fprintf(stderr,"openFile %s\n", [filename UTF8String]); fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false"); [self setupWorkingDirectory: init_path]; fprintf(stderr,"launchgin perl\n"); [self launchPerl: filename]; } @end int main( int argc, char** argv) { int i; NSAutoreleasePool* pool; fprintf(stderr, "ARGC %d \n", argc); for (i = 0; i < argc; ++i) { fprintf(stderr,"ARGV[%d] %s\n",i,argv[i]); } init_path = YES; memset(scriptfile,0,MAXPATHLEN); if (argc >= 2) { if ( argc == 2 ) { strncpy(scriptfile,argv[1],strlen(argv[1])); } else { strncpy(scriptfile,argv[1],strlen(argv[2])); } } fprintf(stderr, "[main] SCRIPT: %s\n",scriptfile); pool = [[NSAutoreleasePool alloc] init]; [SDLPerlApplication sharedApplication]; [NSApp setMainMenu: [[NSMenu alloc] init]]; sdlplmain = [[SDLPerlMain alloc] init]; [sdlplmain retain]; [NSApp setDelegate: sdlplmain]; [NSApp run]; fprintf(stderr,"Terminating NSApp\n"); [sdlplmain release]; [pool release]; return 0; }