Cocoa hooks for MacOS X.

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1433 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
meep-eep
2005-01-05 10:08:37 +00:00
parent be85c3917f
commit 2fa71c9337
6 changed files with 338 additions and 7 deletions
+1
View File
@@ -1,4 +1,5 @@
Changes towards version 0.4:
- Cocoa hooks for MacOS X, from Nic
- Corrected number for combat energy when outfitting starship. - SvdB
- Added dumping planet info to uqmdebug.c - SvdB
- Check language.txt for locale, from Zap
+2 -2
View File
@@ -105,9 +105,9 @@ build_rec_dependancies() {
mv -f -- "$DEPEND_FILE".tmp "$DEPEND_FILE"
}
# Output the .o file for a .c file.
# Output the .o file for a given .c or .m (Objective-C) file
build_collect_o_files() {
eval echo "\$BUILD_WORK_ESC/\${${BUILD_PROJECT}_OBJS}\${1%.c}.o"
eval echo "\$BUILD_WORK_ESC/\${${BUILD_PROJECT}_OBJS}\${1%.[cm]}.o"
}
# Output the extra .o file with the complete path
+23 -5
View File
@@ -99,18 +99,27 @@ LIB_SDL_NAME="Simple DirectMedia Layer"
case "$OSNAME" in
FreeBSD) LIB_SDL_CFLAGS='$(sdl11-config --cflags)' ;;
Darwin) LIB_SDL_CFLAGS='-I/System/Library/Frameworks/SDL.framework/Headers
-I/Library/Frameworks/SDL.framework/Headers
-I$HOME/Library/Frameworks/SDL.framework/Headers'
;;
*) LIB_SDL_CFLAGS='$(sdl-config --cflags)' ;;
esac
case "$OSNAME" in
FreeBSD) LIB_SDL_LDFLAGS='$(sdl11-config --libs)' ;;
Darwin) LIB_SDL_LDFLAGS='-framework SDL -framework Cocoa -lobjc' ;;
*) LIB_SDL_LDFLAGS='$(sdl-config --libs)' ;;
esac
case "$OSNAME" in
FreeBSD) LIB_SDL_VERSION='$(sdl11-config --version)' ;;
Darwin) LIB_SDL_VERSION=$(echo \
"SDL_MAJOR_VERSION.SDL_MINOR_VERSION.SDL_PATCHLEVEL" | \
gcc -E -include SDL_version.h $LIB_SDL_CFLAGS - | \
tail -1 | tr -d ' ') ;;
*) LIB_SDL_VERSION='$(sdl-config --version)' ;;
esac
case "$OSNAME" in
Darwin)
Disabled)
LIB_SDL_DETECT="Darwin_SDL_detect SDL"
Darwin_SDL_detect() {
local LIB TEMP_LDFLAGS TEMP_CFLAGS
@@ -135,15 +144,24 @@ LIB_SDL_mixer_CFLAGS="$LIB_SDL_CFLAGS"
LIB_SDL_mixer_LDFLAGS="$LIB_SDL_LDFLAGS -lSDL_mixer"
LIB_SDL_mixer_VERSION=""
case "$OSNAME" in
Darwin) LIB_SDL_mixer_DETECT="Darwin_SDL_detect SDL_mixer" ;;
Disabled) LIB_SDL_mixer_DETECT="Darwin_SDL_detect SDL_mixer" ;;
esac
LIB_SDL_image_NAME="SDL_image"
LIB_SDL_image_CFLAGS="$LIB_SDL_CFLAGS"
LIB_SDL_image_LDFLAGS="$LIB_SDL_LDFLAGS -lSDL_image"
case "$OSNAME" in
Darwin) LIB_SDL_image_CFLAGS="-I/System/Library/Frameworks/SDL_image.framework/Headers
-I/Library/Frameworks/SDL_image.framework/Headers
-I$HOME/Library/Frameworks/SDL_image.framework/Headers"
;;
*) LIB_SDL_image_CFLAGS="$LIB_SDL_CFLAGS" ;;
esac
case "$OSNAME" in
Darwin) LIB_SDL_image_LDFLAGS="-framework SDL_image" ;;
*) LIB_SDL_image_LDFLAGS="$LIB_SDL_LDFLAGS -lSDL_image" ;;
esac
LIB_SDL_image_VERSION=""
case "$OSNAME" in
Darwin) LIB_SDL_image_DETECT="Darwin_SDL_detect SDL_image" ;;
Disabled) LIB_SDL_image_DETECT="Darwin_SDL_detect SDL_image" ;;
esac
LIB_openal_NAME="OpenAL"
+6
View File
@@ -1,4 +1,10 @@
uqm_SUBDIRS="sc2code getopt res"
case "$OSNAME" in
Darwin)
uqm_SUBDIRS="$uqm_SUBDIRS darwin"
;;
esac
uqm_CFILES="options.c port.c starcon2.c"
test_CFILES=test.c
+11
View File
@@ -0,0 +1,11 @@
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
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
*/
#import <Cocoa/Cocoa.h>
@interface SDLMain : NSObject
@end
+295
View File
@@ -0,0 +1,295 @@
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
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
Modified for use with The Ur-Quan Masters by Nicolas Simonds
<uqm at submedia dot net>
*/
#import "SDL.h"
#import "SDLMain.h"
#import <sys/param.h>
/* for PATH_MAX */
#import <string.h>
/* for strrchr() */
#import <unistd.h>
static int gArgc;
static char **gArgv;
static BOOL gFinderLaunch;
/* An internal Apple class used to setup Apple menus */
@interface NSAppleMenuController:NSObject {}
- (void)controlMenu:(NSMenu *)aMenu;
@end
@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);
(void) sender; /* Get rid of unused variable warning */
}
/* override NSApplication:sendEvent, to keep Cocoa from beeping on
non-command keystrokes */
- (void)sendEvent:(NSEvent *)anEvent {
if (NSKeyDown == [anEvent type] || NSKeyUp == [anEvent type]) {
if ([anEvent modifierFlags] & NSCommandKeyMask)
[super sendEvent: anEvent];
} else
[super sendEvent: anEvent];
}
@end
/* The main class of the application, the application's delegate */
@implementation SDLMain
static char *
basename (char *path)
{
char *base;
base = strrchr (path, '/');
if (base == NULL)
return path;
return (base + 1);
}
/* Set the working directory to the .app's parent directory */
- (void)
setupWorkingDirectory:(BOOL)shouldChdir
{
char origindir[PATH_MAX];
char *c;
if (!shouldChdir)
return;
strncpy (origindir, gArgv[0], sizeof origindir);
origindir[sizeof origindir - 1] = '\0';
c = basename (origindir);
if (c == origindir)
strcpy (origindir, ".");
else
*c = '\0';
/* chdir to the binary app's point of origin */
if (chdir (origindir) != 0)
abort ();
/* then chdir to the .app's parent */
if (chdir ("../../../") != 0)
abort ();
}
void
setupAppleMenu (void)
{
NSMenu *appleMenu;
NSMenuItem *menuItem;
NSString *title;
NSString *appName;
appName = [NSString stringWithUTF8String:basename (gArgv[0])];
appleMenu = [[NSMenu alloc] initWithTitle:appName];
/* Add menu items */
title = [@"Hide " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(hide:)
keyEquivalent:@"h"];
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others"
action:@selector(hideOtherApplications:)
keyEquivalent:@"h"];
[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
[appleMenu addItemWithTitle:@"Show All"
action:@selector(unhideAllApplications:)
keyEquivalent:@""];
[appleMenu addItem:[NSMenuItem separatorItem]];
title = [@"Quit " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(terminate:)
keyEquivalent:@"q"];
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil
keyEquivalent:@""];
[menuItem setSubmenu:appleMenu];
[[NSApp mainMenu] addItem:menuItem];
/* Tell the application object that this is now the application menu */
[NSApp setAppleMenu:appleMenu];
/* Finally give up our references to the objects */
[appleMenu release];
[menuItem 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 (int argc, char **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];
(void) argc; /* Get rid of unused variable warning */
(void) argv; /* Get rid of unused variable warning */
}
/* Called when the internal event loop has just started running */
- (void)
applicationDidFinishLaunching: (NSNotification *) note
{
int status;
/* allow Cocoa to hear keystrokes like Command-Q, etc. */
setenv ("SDL_ENABLEAPPEVENTS", "1", 1);
/* Set the working directory to the .app's parent directory */
[self setupWorkingDirectory:gFinderLaunch];
/* Hand off to main application code */
status = SDL_main (gArgc, gArgv);
/* We're done, thank you for playing */
exit (status);
(void) note; /* Get rid of unused variable warning */
}
@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
/* 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;
/* This is passed if we are launched by double-clicking */
if (argc >= 2 && strcmp (argv[1], "-psn") == 0) {
gArgc = 1;
gFinderLaunch = YES;
} else {
gArgc = argc;
gFinderLaunch = NO;
}
gArgv = (char **) malloc (sizeof *gArgv * (gArgc + 1));
if (gArgv == NULL)
abort ();
for (i = 0; i < gArgc; i++)
gArgv[i] = argv[i];
gArgv[i] = NULL;
CustomApplicationMain (argc, argv);
free (gArgv);
return 0;
}