From 6bb2f2ef8dffe24903ff541675e5e4b31d3801b1 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 22 Feb 2014 17:55:58 -0800 Subject: [PATCH] Fixed bug 2347 - On OSX, an SDL app prevents system shutdown. Tim McDaniel On OSX, an SDL app forces a system shutdown to be cancelled. This happens because [SDLAppDelegate applicationShouldTerminate] returns NSTerminateCancel. A better approach is to subclass NSApplication and override terminate to do nothing except call SDL_SendQuit. In response to a system shutdown notification, this allows the normal SDL Quit event processing to occur, and if the app then terminates, system shutdown occurs normally. Please see the attached patch, based on SDL 2.0.1. --- src/video/cocoa/SDL_cocoaevents.m | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/video/cocoa/SDL_cocoaevents.m b/src/video/cocoa/SDL_cocoaevents.m index a219e29ac..b3baa8378 100644 --- a/src/video/cocoa/SDL_cocoaevents.m +++ b/src/video/cocoa/SDL_cocoaevents.m @@ -36,6 +36,22 @@ #define UsrActivity 1 #endif +@interface SDLApplication : NSApplication + +- (void)terminate:(id)sender; + +@end + +@implementation SDLApplication + +// Override terminate to handle Quit and System Shutdown smoothly. +- (void)terminate:(id)sender +{ + SDL_SendQuit(); +} + +@end // SDLApplication + /* setAppleMenu disappeared from the headers in 10.4 */ @interface NSApplication(NSAppleMenu) - (void)setAppleMenu:(NSMenu *)menu; @@ -71,12 +87,6 @@ [super dealloc]; } -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender -{ - SDL_SendQuit(); - return NSTerminateCancel; -} - - (void)focusSomeWindow:(NSNotification *)aNotification { /* HACK: Ignore the first call. The application gets a @@ -255,7 +265,7 @@ Cocoa_RegisterApp(void) pool = [[NSAutoreleasePool alloc] init]; if (NSApp == nil) { - [NSApplication sharedApplication]; + [SDLApplication sharedApplication]; if ([NSApp mainMenu] == nil) { CreateApplicationMenus();