diff --git a/darwin/init.m b/darwin/init.m index db5cf8f4..3893be08 100644 --- a/darwin/init.m +++ b/darwin/init.m @@ -22,6 +22,10 @@ static BOOL canQuit = NO; if (!canQuit) complain("call to [NSApp terminate:] when not ready to terminate"); + + // TODO move the body of uiQuit() here + // TODO make uiQuit() just call terminate: + // TODO update the above comment } @end @@ -38,8 +42,12 @@ static BOOL canQuit = NO; { // for debugging NSLog(@"in applicationShouldTerminate:"); - canQuit = YES; - return NSTerminateNow; + if (shouldQuit()) { + canQuit = YES; + // this will call terminate:, which is the same as uiQuit() + return NSTerminateNow; + } + return NSTerminateCancel; } - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app diff --git a/darwin/menu.m b/darwin/menu.m index 11f62267..56cae820 100644 --- a/darwin/menu.m +++ b/darwin/menu.m @@ -64,6 +64,12 @@ enum { (*(item->onClicked))(uiMenuItem(item), windowFromNSWindow([NSApp keyWindow]), item->onClickedData); } +- (IBAction)onQuitClicked:(id)sender +{ + if ([[NSApp delegate] applicationShouldTerminate:NSApp] == NSTerminateNow) + [NSApp terminate:self]; +} + - (void)register:(NSMenuItem *)item to:(struct menuItem *)smi { NSValue *v; @@ -169,7 +175,7 @@ enum { // and finally Quit // DON'T use @selector(terminate:) as the action; we handle termination ourselves title = [@"Quit " stringByAppendingString:appName]; - item = [[NSMenuItem alloc] initWithTitle:title action:@selector(onClicked:) keyEquivalent:@"q"]; + item = [[NSMenuItem alloc] initWithTitle:title action:@selector(onQuitClicked:) keyEquivalent:@"q"]; [item setTarget:self]; [appMenu addItem:item]; self.quitItem = item; @@ -210,6 +216,8 @@ static void menuItemOnClicked(uiMenuItem *ii, void (*f)(uiMenuItem *, uiWindow * { struct menuItem *item = (struct menuItem *) ii; + if (item->type == typeQuit) + complain("attempt to call uiMenuItemOnClicked() on a Quit item; use uiOnShouldQuit() instead"); item->onClicked = f; item->onClickedData = data; }