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

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40159
This commit is contained in:
Sam Lantinga 2001-08-21 07:19:59 +00:00
parent 6dbdba950a
commit 75ab0e7ade
8 changed files with 170 additions and 62 deletions

View file

@ -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 @@ static char **gArgv;
/* 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 @@ static char **gArgv;
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 @@ static char **gArgv;
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 @@ static char **gArgv;
/* 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 @@ static char **gArgv;
}
@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