SDLMain.m
资源名称:NETVIDEO.rar [点击查看]
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:
流媒体/Mpeg4/MP4
开发平台:
Visual C++
- /* 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 "SDL.h"
- #import "SDLMain.h"
- #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 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
- /* Set the working directory to the .app's parent directory */
- - (void) setupWorkingDirectory:(BOOL)shouldChdir
- {
- char parentdir[MAXPATHLEN];
- char *c;
- strncpy ( parentdir, gArgv[0], sizeof(parentdir) );
- c = (char*) parentdir;
- while (*c != ' ') /* go to end */
- c++;
- while (*c != '/') /* back up to parent */
- c--;
- *c++ = ' '; /* cut off last part (binary name) */
- if (shouldChdir)
- {
- assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */
- assert ( chdir ("../../../") == 0 ); /* chdir to the .app's parent */
- }
- }
- #if SDL_USE_NIB_FILE
- /* Fix menu to contain the real app name instead of "SDL App" */
- - (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName
- {
- NSRange aRange;
- NSEnumerator *enumerator;
- NSMenuItem *menuItem;
- aRange = [[aMenu title] rangeOfString:@"SDL App"];
- if (aRange.length != 0)
- [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:appName]];
- if ([menuItem hasSubmenu])
- [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];
- #if SDL_USE_NIB_FILE
- /* Set the main menu to contain the real app name instead of "SDL App" */
- [self fixMenu:[NSApp mainMenu] withAppName:[[NSProcessInfo processInfo] processName]];
- #endif
- /* Hand off to main application code */
- status = SDL_main (gArgc, gArgv);
- /* We're done, thank you for playing */
- exit(status);
- }
- @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 && strncmp (argv[1], "-psn", 4) == 0 ) {
- gArgc = 1;
- gFinderLaunch = YES;
- } else {
- gArgc = argc;
- gFinderLaunch = NO;
- }
- gArgv = (char**) malloc (sizeof(*gArgv) * (gArgc+1));
- assert (gArgv != NULL);
- 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;
- }