Browse Source

feat: add `did-resign-active` event on app (#37933)

feat: add did-resign-active event on app
Shelley Vohr 2 years ago
parent
commit
32afdda9ee

+ 13 - 2
docs/api/app.md

@@ -150,9 +150,20 @@ Returns:
 
 * `event` Event
 
-Emitted when mac application become active. Difference from `activate` event is
+Emitted when the application becomes active. This differs from the `activate` event in
 that `did-become-active` is emitted every time the app becomes active, not only
-when Dock icon is clicked or application is re-launched.
+when Dock icon is clicked or application is re-launched. It is also emitted when a user
+switches to the app via the macOS App Switcher.
+
+### Event: 'did-resign-active' _macOS_
+
+Returns:
+
+* `event` Event
+
+Emitted when the app is no longer active and doesn’t have focus. This can be triggered,
+for example, by clicking on another application or by using the macOS App Switcher to
+switch to another application.
 
 ### Event: 'continue-activity' _macOS_
 

+ 4 - 0
shell/browser/api/electron_api_app.cc

@@ -787,6 +787,10 @@ void App::OnNewWindowForTab() {
 void App::OnDidBecomeActive() {
   Emit("did-become-active");
 }
+
+void App::OnDidResignActive() {
+  Emit("did-resign-active");
+}
 #endif
 
 bool App::CanCreateWindow(

+ 1 - 0
shell/browser/api/electron_api_app.h

@@ -116,6 +116,7 @@ class App : public ElectronBrowserClient::Delegate,
                                  base::Value::Dict user_info) override;
   void OnNewWindowForTab() override;
   void OnDidBecomeActive() override;
+  void OnDidResignActive() override;
 #endif
 
   // content::ContentBrowserClient:

+ 5 - 0
shell/browser/browser.cc

@@ -291,6 +291,11 @@ void Browser::DidBecomeActive() {
   for (BrowserObserver& observer : observers_)
     observer.OnDidBecomeActive();
 }
+
+void Browser::DidResignActive() {
+  for (BrowserObserver& observer : observers_)
+    observer.OnDidResignActive();
+}
 #endif
 
 }  // namespace electron

+ 4 - 1
shell/browser/browser.h

@@ -278,8 +278,11 @@ class Browser : public WindowListObserver {
   // Tell the application to create a new window for a tab.
   void NewWindowForTab();
 
-  // Tell the application that application did become active
+  // Indicate that the app is now active.
   void DidBecomeActive();
+  // Indicate that the app is no longer active and doesn’t have focus.
+  void DidResignActive();
+
 #endif  // BUILDFLAG(IS_MAC)
 
   // Tell the application that application is activated with visible/invisible

+ 3 - 1
shell/browser/browser_observer.h

@@ -78,8 +78,10 @@ class BrowserObserver : public base::CheckedObserver {
   // User clicked the native macOS new tab button. (macOS only)
   virtual void OnNewWindowForTab() {}
 
-  // Browser did become active.
+  // Browser became active.
   virtual void OnDidBecomeActive() {}
+  // Browser lost active status.
+  virtual void OnDidResignActive() {}
 #endif
 
  protected:

+ 4 - 0
shell/browser/mac/electron_application_delegate.mm

@@ -92,6 +92,10 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
   electron::Browser::Get()->DidBecomeActive();
 }
 
+- (void)applicationDidResignActive:(NSNotification*)notification {
+  electron::Browser::Get()->DidResignActive();
+}
+
 - (NSMenu*)applicationDockMenu:(NSApplication*)sender {
   if (menu_controller_)
     return [menu_controller_ menu];