*** empty log message ***
authorSam Lantinga <slouken@libsdl.org>
Fri, 02 Nov 2001 18:12:52 +0000
changeset 221 50620ec9c86a
parent 220 7861d904fb77
child 222 0a98dba2c700
*** empty log message ***
README.MacOSX
sdl-config.in
sdl.m4
src/joystick/linux/SDL_sysjoystick.c
src/main/Makefile.am
src/main/macosx/SDLMain.h
src/main/macosx/SDLMain.m
test/acinclude.m4
test/testgl.c
--- 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