Mac: Better handling when someone else is the app delegate.

main
J?rgen P. Tjern? 2013-10-07 16:01:40 -07:00
parent 69e1e779c2
commit 2568a367c8
2 changed files with 61 additions and 5 deletions

View File

@ -29,6 +29,42 @@ gcc to make this easy is provided in test/gcc-fat.sh
To use the library once it's built, you essential have two possibilities: To use the library once it's built, you essential have two possibilities:
use the traditional autoconf/automake/make method, or use Xcode. use the traditional autoconf/automake/make method, or use Xcode.
==============================================================================
Caveats for using SDL with Mac OS X
==============================================================================
Some things you have to be aware of when using SDL on Mac OS X:
- If you register your own NSApplicationDelegate (using [NSApp setDelegate:]),
SDL will not register its own. This means that SDL will not terminate using
SDL_Quit if it receives a termination request, it will terminate like a
normal app, and it will not send a SDL_DROPFILE when you request to open a
file with the app. To solve these issues, put the following code in your
NSApplicationDelegate implementation:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) {
SDL_Event event;
event.type = SDL_QUIT;
SDL_PushEvent(&event);
}
return NSTerminateCancel;
}
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) {
SDL_Event event;
event.type = SDL_DROPFILE;
event.drop.file = SDL_strdup([filename UTF8String]);
return (SDL_PushEvent(&event) > 0);
}
return NO;
}
============================================================================== ==============================================================================
Using the Simple DirectMedia Layer with a traditional Makefile Using the Simple DirectMedia Layer with a traditional Makefile
============================================================================== ==============================================================================

View File

@ -42,12 +42,11 @@
@end @end
@interface SDLAppDelegate : NSObject { @interface SDLAppDelegate : NSObject {
@public
BOOL seenFirstActivate; BOOL seenFirstActivate;
} }
- (id)init; - (id)init;
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
- (void)applicationDidBecomeActive:(NSNotification *)aNotification;
@end @end
@implementation SDLAppDelegate : NSObject @implementation SDLAppDelegate : NSObject
@ -57,18 +56,28 @@
if (self) { if (self) {
seenFirstActivate = NO; seenFirstActivate = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(focusSomeWindow:)
name:NSApplicationDidBecomeActiveNotification
object:nil];
} }
return self; return self;
} }
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{ {
SDL_SendQuit(); SDL_SendQuit();
return NSTerminateCancel; return NSTerminateCancel;
} }
- (void)applicationDidBecomeActive:(NSNotification *)aNotification - (void)focusSomeWindow:(NSNotification *)aNotification
{ {
/* HACK: Ignore the first call. The application gets a /* HACK: Ignore the first call. The application gets a
* applicationDidBecomeActive: a little bit after the first window is * applicationDidBecomeActive: a little bit after the first window is
@ -111,6 +120,8 @@
} }
@end @end
static SDLAppDelegate *appDelegate = nil;
static NSString * static NSString *
GetApplicationName(void) GetApplicationName(void)
{ {
@ -235,8 +246,17 @@ Cocoa_RegisterApp(void)
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
} }
if (NSApp && ![NSApp delegate]) { if (NSApp && !appDelegate) {
[NSApp setDelegate:[[SDLAppDelegate alloc] init]]; appDelegate = [[SDLAppDelegate alloc] init];
/* If someone else has an app delegate, it means we can't turn a
* termination into SDL_Quit, and we can't handle application:openFile:
*/
if (![NSApp delegate]) {
[NSApp setDelegate:appDelegate];
} else {
appDelegate->seenFirstActivate = YES;
}
} }
[pool release]; [pool release];
} }