appstub.macos.m 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <brl.mod/blitz.mod/blitz.h>
  2. #import <AppKit/AppKit.h>
  3. void __bb_brl_appstub_appstub();
  4. static int app_argc;
  5. static char **app_argv;
  6. static NSMutableArray *_appArgs;
  7. static NSAutoreleasePool *_globalPool;
  8. static void createAppMenu( NSString *appName ){
  9. NSMenu *appMenu;
  10. NSMenuItem *item;
  11. NSString *title;
  12. [NSApp setMainMenu:[NSMenu new]];
  13. appMenu=[NSMenu new];
  14. title=[@"Hide " stringByAppendingString:appName];
  15. [appMenu addItemWithTitle:@"Hide" action:@selector(hide:) keyEquivalent:@"h"];
  16. item=(NSMenuItem*)[appMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
  17. [item setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
  18. [appMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
  19. [appMenu addItem:[NSMenuItem separatorItem]];
  20. title=[@"Quit " stringByAppendingString:appName];
  21. [appMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
  22. item=[NSMenuItem new];
  23. [item setSubmenu:appMenu];
  24. [[NSApp mainMenu] addItem:item];
  25. [NSApp performSelector:NSSelectorFromString(@"setAppleMenu:") withObject:appMenu];
  26. }
  27. static void run(){
  28. signal( SIGPIPE,SIG_IGN );
  29. bbStartup( app_argc,app_argv,0,0 );
  30. __bb_brl_appstub_appstub();
  31. exit( 0 );
  32. }
  33. void bbFlushAutoreleasePool(){
  34. [_globalPool release];
  35. _globalPool=[[NSAutoreleasePool alloc] init];
  36. }
  37. @interface BlitzMaxAppDelegate : NSObject{
  38. }
  39. @end
  40. @implementation BlitzMaxAppDelegate
  41. -(void)applicationWillTerminate:(NSNotification*)notification{
  42. exit(0);
  43. }
  44. -(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender{
  45. return NSTerminateCancel;
  46. }
  47. -(BOOL)application:(NSApplication*)app openFile:(NSString*)path{
  48. [_appArgs addObject:path];
  49. return YES;
  50. }
  51. -(void)applicationDidFinishLaunching:(NSNotification*)notification{
  52. int i;
  53. app_argc=[_appArgs count];
  54. app_argv=(char**)malloc( (app_argc+1)*sizeof(char*) );
  55. for( i=0;i<app_argc;++i ){
  56. NSString *t=[_appArgs objectAtIndex:i];
  57. char *p=(char*)malloc( [t length]+1 );
  58. strcpy( p,[t cString] );
  59. app_argv[i]=p;
  60. }
  61. app_argv[i]=0;
  62. [_appArgs release];
  63. [NSApp activateIgnoringOtherApps:YES];
  64. run();
  65. }
  66. @end
  67. int main( int argc,char *argv[] ){
  68. int i;
  69. CFURLRef url;
  70. char *app_file,*p;
  71. _globalPool=[[NSAutoreleasePool alloc] init];
  72. [NSApplication sharedApplication];
  73. app_argc=argc;
  74. app_argv=argv;
  75. url=CFBundleCopyExecutableURL( CFBundleGetMainBundle() );
  76. app_file=malloc( 4096 );
  77. CFURLGetFileSystemRepresentation( url,true,(UInt8*)app_file,4096 );
  78. if( strstr( app_file,".app/Contents/MacOS/" ) ){
  79. //GUI app!
  80. //
  81. p=strrchr( app_file,'/' );
  82. if( p ){
  83. ++p;
  84. }else{
  85. p=app_file;
  86. }
  87. createAppMenu( [NSString stringWithCString:p] );
  88. free( app_file );
  89. [NSApp setDelegate:[[BlitzMaxAppDelegate alloc] init]];
  90. _appArgs=[[NSMutableArray arrayWithCapacity:10] retain];
  91. [_appArgs addObject:[NSString stringWithCString:argv[0]] ];
  92. [NSApp run];
  93. }else{
  94. //Console app!
  95. //
  96. free( app_file );
  97. run();
  98. }
  99. }