--- a/README.MacOSX Thu Nov 01 16:45:40 2001 +0000
+++ b/README.MacOSX Fri Nov 02 18:12:52 2001 +0000
@@ -25,79 +25,52 @@
Using the Simple DirectMedia Layer with a traditional Makefile
==============================================================================
-In the following, it will be mostly assumed that you are using autoconf and
-automake to setup your SDL project, and furthermore that you use the AM_PATH_SDL
-macro provided by SDL in sdl.m4. If you are not using these tools, you can
-still use SDL but it will be somewhat hard to get running.
-
-Only step 1) is really required to get started, but for full OS X support you
-will want to do the other steps, too.
-
-1) Update your acinclude.m4 file in case you have copied an older version of
- sdl.m4 into it. This is essential as AM_PATH_SDL now performs some additional
- tasks when used on MacOS X
+An existing autoconf/automake build system for your SDL app has good chances
+to work almost unchanged on OS X. However, to produce a "real" MacOS X binary
+that you can distribute to users, you need to put the generated binary into a
+so called "bundle", which basically is a fancy folder with a name like
+"MyCoolGame.app".
- Rationale: AM_PATH_SDL copies /usr/local/share/sdl/Info.plist and the folder
- /usr/local/share/sdl/SDL_main.nib/ into the directory where configure is invoked.
- This is essential for the configure script to be able to run the test code
- that detects SDL.
-
-2) Copy SDL's Info.plist.in file (from src/main/macosx) into your project's main
- folder (the same spot that your configure.in sits), and edit it to suite your
- needs. Then add it to your AC_OUTPUT list in configure.in
-
- Rationale: The Info.plist file can be used to specify an icon file for
- your app, and also to provide a human readable version/copyright string
- and other meta-information to the user via the Finder's Get Info dialog.
-
-3) Add something like the following rule to your Makefile.am:
+To get this build automatically, add something like the following rule to
+your Makefile.am:
bundle_contents = APP_NAME.app/Contents
APP_NAME_bundle: EXE_NAME
mkdir -p $(bundle_contents)/MacOS
mkdir -p $(bundle_contents)/Resources
- mkdir -p $(bundle_contents)/Resources/SDL_main.nib
echo "APPL????" > $(bundle_contents)/PkgInfo
- $(INSTALL_DATA) Info.plist $(bundle_contents)/
- $(INSTALL_DATA) SDL_main.nib/*.nib $(bundle_contents)/Resources/SDLMain.nib
$(INSTALL_PROGRAM) $< $(bundle_contents)/MacOS/
- You should replace EXE_NAME with the name of the executable. APP_NAME is what
- will be visible to the user in the Finder. Usually it will be the same
- as EXE_NAME but capitalized. E.g. if EXE_NAME is "testgame" then APP_NAME
- usually is "TestGame". You might also want to use @PACKAGE@ to use the package
- name as specified in your configure.in file.
+You should replace EXE_NAME with the name of the executable. APP_NAME is what
+will be visible to the user in the Finder. Usually it will be the same
+as EXE_NAME but capitalized. E.g. if EXE_NAME is "testgame" then APP_NAME
+usually is "TestGame". You might also want to use @PACKAGE@ to use the package
+name as specified in your configure.in file.
- If your project builds more than one application, you will have to do a bit more.
- For each of your target applications, you need a seperate rule. Furthermore, each
- needs its own Info.plist file, since that has to contain the exact name of the
- executable (i.e. EXE_NAME above). One way to do that is to use sed in your make rules
- and modify a single master Info.plist.
+If your project builds more than one application, you will have to do a bit
+more. For each of your target applications, you need a seperate rule.
- Rationale: on Mac OS X, executables have to be put into so-called "bundles".
- The make rule given above will construct such a bundle around the executable
- for you. You need to make a copy of it for each target application.
-
-4) If you want the create bundles to be installed, you may want to add this
- rule to your Makefile.am:
+If you want the created bundles to be installed, you may want to add this
+rule to your Makefile.am:
install-exec-hook: APP_NAME_bundle
rm -rf $(DESTDIR)$(prefix)/Applications/APP_NAME.app
mkdir -p $(DESTDIR)$(prefix)/Applications/
cp -r $< /$(DESTDIR)$(prefix)Applications/
- This rule takes the Bundle created by the rule from step 3 and installs them
- into $(DESTDIR)$(prefix)/Applications/.
+This rule takes the Bundle created by the rule from step 3 and installs them
+into $(DESTDIR)$(prefix)/Applications/.
- Again, if you want to install multiple applications, you will have to augment
- the make rule accordingly.
+Again, if you want to install multiple applications, you will have to augment
+the make rule accordingly.
==============================================================================
Using the Simple DirectMedia Layer with Project Builder
==============================================================================
-These instructions are for using Apple's Project Builder IDE to build SDL applications.
+These instructions are for using Apple's Project Builder IDE to build SDL
+applications.
- First steps
--- a/sdl-config.in Thu Nov 01 16:45:40 2001 +0000
+++ b/sdl-config.in Fri Nov 02 18:12:52 2001 +0000
@@ -56,12 +56,6 @@
@ENABLE_STATIC_TRUE@ libdirs="-L@libdir@ @SDL_RLD_FLAGS@"
@ENABLE_STATIC_TRUE@ echo $libdirs @SDL_LIBS@ @SYSTEM_LIBS@
@ENABLE_STATIC_TRUE@ ;;
-@TARGET_MACOSX_TRUE@ --nib)
-@TARGET_MACOSX_TRUE@ echo @datadir@/sdl/SDLMain.nib
-@TARGET_MACOSX_TRUE@ ;;
-@TARGET_MACOSX_TRUE@ --plist)
-@TARGET_MACOSX_TRUE@ echo @datadir@/sdl/Info.plist
-@TARGET_MACOSX_TRUE@ ;;
*)
echo "${usage}" 1>&2
exit 1
--- a/sdl.m4 Thu Nov 01 16:45:40 2001 +0000
+++ b/sdl.m4 Fri Nov 02 18:12:52 2001 +0000
@@ -59,17 +59,6 @@
dnl checks the results of sdl-config to some extent
dnl
rm -f conf.sdltest
- case "$target" in
- *-*-darwin*)
- cp -r `$SDL_CONFIG --nib` .
- dnl create an Info.plist file, unless one exists
- if test -f Info.plist ; then
- :
- else
- cp `$SDL_CONFIG --plist` .
- fi
- ;;
- esac
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
--- a/src/joystick/linux/SDL_sysjoystick.c Thu Nov 01 16:45:40 2001 +0000
+++ b/src/joystick/linux/SDL_sysjoystick.c Fri Nov 02 18:12:52 2001 +0000
@@ -61,9 +61,10 @@
"'Microsoft SideWinder Dual Strike USB version 1.0' 2 1 0",
"'WingMan Interceptor' 3 3 0",
/* WingMan Extreme Analog - not recognized by default
- "'Analog 3-axis 4-button joystick' 2 1",
+ "'Analog 3-axis 4-button joystick' 2 1 0",
*/
"'WingMan Extreme Digital 3D' 4 1 0",
+ "'Analog 2-axis 4-button 1-hat FCS joystick' 2 1 0",
NULL
};
#else
--- a/src/main/Makefile.am Thu Nov 01 16:45:40 2001 +0000
+++ b/src/main/Makefile.am Fri Nov 02 18:12:52 2001 +0000
@@ -4,12 +4,11 @@
# This is necessary because some platforms have special program
# entry points, which require special application initialization.
-SUBDIRS = macosx
-
ARCH_SUBDIRS = $(srcdir)/beos \
$(srcdir)/epoc \
$(srcdir)/linux \
$(srcdir)/macos \
+ $(srcdir)/macosx \
$(srcdir)/win32
# Build a separate library containing the main() entry point.
--- a/src/main/macosx/SDLMain.h Thu Nov 01 16:45:40 2001 +0000
+++ b/src/main/macosx/SDLMain.h Fri Nov 02 18:12:52 2001 +0000
@@ -1,5 +1,6 @@
-/* SDLMain.h - main entry point for our Cocoa-ized SDL app
- Darrell Walisser - dwaliss1@purdue.edu
+/* 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
*/
@@ -7,9 +8,4 @@
#import <Cocoa/Cocoa.h>
@interface SDLMain : NSObject
-{
-}
-- (IBAction)quit:(id)sender;
-- (IBAction)makeFullscreen:(id)sender;
-- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
@end
--- 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;
}
--- a/test/acinclude.m4 Thu Nov 01 16:45:40 2001 +0000
+++ b/test/acinclude.m4 Fri Nov 02 18:12:52 2001 +0000
@@ -59,17 +59,6 @@
dnl checks the results of sdl-config to some extent
dnl
rm -f conf.sdltest
- case "$target" in
- *-*-darwin*)
- cp -r `$SDL_CONFIG --nib` .
- dnl create an Info.plist file, unless one exists
- if test -f Info.plist ; then
- :
- else
- cp `$SDL_CONFIG --plist` .
- fi
- ;;
- esac
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
--- a/test/testgl.c Thu Nov 01 16:45:40 2001 +0000
+++ b/test/testgl.c Fri Nov 02 18:12:52 2001 +0000
@@ -7,7 +7,6 @@
#ifdef HAVE_OPENGL
#include "SDL_opengl.h"
-#endif
#define SHADED_CUBE