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