diff --git a/browser/api/atom_api_app.cc b/browser/api/atom_api_app.cc index f2b021c0d68..d07c387ba17 100644 --- a/browser/api/atom_api_app.cc +++ b/browser/api/atom_api_app.cc @@ -44,6 +44,10 @@ void App::OnOpenURL(const std::string& url) { Emit("open-url", &args); } +void App::OnActivateWithNoOpenWindows() { + Emit("activate-with-no-open-windows"); +} + void App::OnWillFinishLaunching() { Emit("will-finish-launching"); } diff --git a/browser/api/atom_api_app.h b/browser/api/atom_api_app.h index 7ca6d0817af..9d3eccff187 100644 --- a/browser/api/atom_api_app.h +++ b/browser/api/atom_api_app.h @@ -29,6 +29,7 @@ class App : public EventEmitter, virtual void OnOpenFile(bool* prevent_default, const std::string& file_path) OVERRIDE; virtual void OnOpenURL(const std::string& url) OVERRIDE; + virtual void OnActivateWithNoOpenWindows() OVERRIDE; virtual void OnWillFinishLaunching() OVERRIDE; virtual void OnFinishLaunching() OVERRIDE; diff --git a/browser/atom_application_delegate_mac.mm b/browser/atom_application_delegate_mac.mm index 76dc16fff16..1843298bd5a 100644 --- a/browser/atom_application_delegate_mac.mm +++ b/browser/atom_application_delegate_mac.mm @@ -35,4 +35,15 @@ } } +- (BOOL)applicationShouldHandleReopen:(NSApplication*)theApplication + hasVisibleWindows:(BOOL)flag { + atom::Browser* browser = atom::Browser::Get(); + if (flag) { + return YES; + } else { + browser->ActivateWithNoOpenWindows(); + return NO; + } +} + @end diff --git a/browser/browser.cc b/browser/browser.cc index 49f2cef4ef6..6567aea1546 100644 --- a/browser/browser.cc +++ b/browser/browser.cc @@ -74,6 +74,10 @@ void Browser::OpenURL(const std::string& url) { FOR_EACH_OBSERVER(BrowserObserver, observers_, OnOpenURL(url)); } +void Browser::ActivateWithNoOpenWindows() { + FOR_EACH_OBSERVER(BrowserObserver, observers_, OnActivateWithNoOpenWindows()); +} + void Browser::WillFinishLaunching() { FOR_EACH_OBSERVER(BrowserObserver, observers_, OnWillFinishLaunching()); } diff --git a/browser/browser.h b/browser/browser.h index d20fc973ff2..759e9680f20 100644 --- a/browser/browser.h +++ b/browser/browser.h @@ -62,6 +62,9 @@ class Browser : public WindowListObserver { // Tell the application to open a url. void OpenURL(const std::string& url); + // Tell the application that application is activated with no open windows. + void ActivateWithNoOpenWindows(); + // Tell the application the loading has been done. void WillFinishLaunching(); void DidFinishLaunching(); diff --git a/browser/browser_observer.h b/browser/browser_observer.h index 20b13ad4764..e7f1cd92216 100644 --- a/browser/browser_observer.h +++ b/browser/browser_observer.h @@ -26,6 +26,10 @@ class BrowserObserver { // Browser is used to open a url. virtual void OnOpenURL(const std::string& url) {} + // The browser is activated with no open windows (usually by clicking on the + // dock icon). + virtual void OnActivateWithNoOpenWindows() {} + // The browser has finished loading. virtual void OnWillFinishLaunching() {} virtual void OnFinishLaunching() {} diff --git a/docs/api/browser/app.md b/docs/api/browser/app.md index ae2ec9da615..4c34f883598 100644 --- a/docs/api/browser/app.md +++ b/docs/api/browser/app.md @@ -66,6 +66,12 @@ must be registered to be opened by your application. You should call `event.preventDefault()` if you want to handle this event. +## Event: activate-with-no-open-windows + +Emitted when the application is activated while there is no opened windows. It +usually happens when user has closed all of application's windows and then +click on the application's dock icon. + ## app.quit() Try to close all windows. If all windows are successfully closed, the