electron/atom/browser/atom_application_delegate_mac.mm
Cheng Zhao b994ae8174 mac: Always cancel application termination.
OS X's application termination doesn't work very well with C++ message
loops. Especially when we return NSTerminateLater for shouldTerminate,
it would be impossible for the C++ message loop to quit, because unless
we explictly let NSApp terminate the application, the message loop would
think the application is not terminated and will run forever.

The fix is to simply ignore the Cocoa's application termination request
and let the C++ message loop deal with it compeletey. But we had the
side effect that atom-shell would always cancel OS X's shutdown request,
this is also the approach chosen by Chromium.

Fixes #229.
Fixes atom/atom#1864.
2014-04-15 00:13:00 +08:00

49 lines
1.4 KiB
Text

// Copyright (c) 2013 GitHub, Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "atom/browser/atom_application_delegate_mac.h"
#include "base/strings/sys_string_conversions.h"
#import "atom/browser/atom_application_mac.h"
#include "atom/browser/browser.h"
@implementation AtomApplicationDelegate
- (void)applicationWillFinishLaunching:(NSNotification*)notify {
atom::Browser::Get()->WillFinishLaunching();
}
- (void)applicationDidFinishLaunching:(NSNotification*)notify {
atom::Browser::Get()->DidFinishLaunching();
}
- (BOOL)application:(NSApplication*)sender
openFile:(NSString*)filename {
std::string filename_str(base::SysNSStringToUTF8(filename));
return atom::Browser::Get()->OpenFile(filename_str) ? YES : NO;
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender {
atom::Browser* browser = atom::Browser::Get();
if (browser->is_quiting()) {
return NSTerminateNow;
} else {
// System started termination.
atom::Browser::Get()->Quit();
return NSTerminateCancel;
}
}
- (BOOL)applicationShouldHandleReopen:(NSApplication*)theApplication
hasVisibleWindows:(BOOL)flag {
atom::Browser* browser = atom::Browser::Get();
if (flag) {
return YES;
} else {
browser->ActivateWithNoOpenWindows();
return NO;
}
}
@end