Fixed Objective-C memory leaks
Send an SDL quit event when Command-Q is pressed.
--- a/src/video/cocoa/SDL_cocoaevents.m Tue Jul 25 06:22:42 2006 +0000
+++ b/src/video/cocoa/SDL_cocoaevents.m Tue Jul 25 06:59:14 2006 +0000
@@ -37,6 +37,18 @@
}
@end
+@interface SDLAppDelegate : NSObject
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
+@end
+
+@implementation SDLAppDelegate : NSObject
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
+{
+ SDL_SendQuit();
+ return NSTerminateCancel;
+}
+@end
+
static NSString *
GetApplicationName(void)
{
@@ -139,6 +151,9 @@
}
[NSApp finishLaunching];
}
+ if ([NSApp delegate] == nil) {
+ [NSApp setDelegate:[[SDLAppDelegate alloc] init]];
+ }
[NSApp setRunning];
[pool release];
}
--- a/src/video/cocoa/SDL_cocoawindow.m Tue Jul 25 06:22:42 2006 +0000
+++ b/src/video/cocoa/SDL_cocoawindow.m Tue Jul 25 06:59:14 2006 +0000
@@ -419,6 +419,7 @@
void
Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
NSString *string;
@@ -426,11 +427,13 @@
[nswindow setTitle:string];
[nswindow setMiniwindowTitle:string];
[string release];
+ [pool release];
}
void
Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
NSRect rect;
@@ -441,25 +444,30 @@
ConvertNSRect(&rect);
rect = [nswindow frameRectForContentRect:rect];
[nswindow setFrameOrigin:rect.origin];
+ [pool release];
}
void
Cocoa_SetWindowSize(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
NSSize size;
size.width = window->w;
size.height = window->h;
[nswindow setContentSize:size];
+ [pool release];
}
void
Cocoa_ShowWindow(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
[nswindow makeKeyAndOrderFront:nil];
+ [pool release];
}
void
@@ -473,25 +481,31 @@
void
Cocoa_RaiseWindow(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
[nswindow makeKeyAndOrderFront:nil];
+ [pool release];
}
void
Cocoa_MaximizeWindow(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
[nswindow performZoom:nil];
+ [pool release];
}
void
Cocoa_MinimizeWindow(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
[nswindow performMiniaturize:nil];
+ [pool release];
}
void
@@ -516,24 +530,23 @@
void
Cocoa_DestroyWindow(_THIS, SDL_Window * window)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data) {
- NSAutoreleasePool *pool;
#ifdef SDL_VIDEO_OPENGL
if (window->flags & SDL_WINDOW_OPENGL) {
Cocoa_GL_CleanupWindow(_this, window);
}
#endif
- pool = [[NSAutoreleasePool alloc] init];
[data->listener close];
[data->listener release];
if (data->created) {
[data->window close];
}
SDL_free(data);
- [pool release];
}
+ [pool release];
}
SDL_bool