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
This commit is contained in:
Sam Lantinga
2001-08-21 07:19:59 +00:00
parent 756c728189
commit 43ae18a8fa
8 changed files with 170 additions and 62 deletions

View File

@@ -10,7 +10,11 @@ ARCH_SUBDIRS = $(srcdir)/beos $(srcdir)/linux \
# Build a separate library containing the main() entry point.
lib_LIBRARIES = libSDLmain.a
if TARGET_MACOSX
MAINLIB_ARCH_SRCS = SDLmain.m SDLmain.h
else
MAINLIB_ARCH_SRCS = SDL_main.c
endif
libSDLmain_a_SOURCES = $(MAINLIB_ARCH_SRCS)

View File

@@ -1,7 +1,14 @@
/* SDLMain.h - main entry point for our Cocoa-ized SDL app
Darrell Walisser - dwaliss1@purdue.edu
Feel free to customize this file to suit your needs
*/
#import <Cocoa/Cocoa.h>
@interface SDLMain : NSObject
{
}
- (IBAction)quit:(id)sender;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
@end

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