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;
 }