diff --git a/shell/browser/api/electron_api_browser_window.cc b/shell/browser/api/electron_api_browser_window.cc index 47928436d698e..07fc7e8ab1df4 100644 --- a/shell/browser/api/electron_api_browser_window.cc +++ b/shell/browser/api/electron_api_browser_window.cc @@ -256,22 +256,14 @@ void BrowserWindow::OnWindowClosed() { void BrowserWindow::OnWindowBlur() { web_contents()->StoreFocus(); -#if defined(OS_MACOSX) - auto* rwhv = web_contents()->GetRenderWidgetHostView(); - if (rwhv) - rwhv->SetActive(false); -#endif TopLevelWindow::OnWindowBlur(); } void BrowserWindow::OnWindowFocus() { web_contents()->RestoreFocus(); -#if defined(OS_MACOSX) - auto* rwhv = web_contents()->GetRenderWidgetHostView(); - if (rwhv) - rwhv->SetActive(true); -#else + +#if !defined(OS_MACOSX) if (!api_web_contents_->IsDevToolsOpened()) web_contents()->Focus(); #endif @@ -279,6 +271,14 @@ void BrowserWindow::OnWindowFocus() { TopLevelWindow::OnWindowFocus(); } +void BrowserWindow::OnWindowIsKeyChanged(bool is_key) { +#if defined(OS_MACOSX) + auto* rwhv = web_contents()->GetRenderWidgetHostView(); + if (rwhv) + rwhv->SetActive(is_key); +#endif +} + void BrowserWindow::OnWindowResize() { #if defined(OS_MACOSX) if (!draggable_regions_.empty()) diff --git a/shell/browser/api/electron_api_browser_window.h b/shell/browser/api/electron_api_browser_window.h index acc7a5ca65bf2..c7f1a99f30175 100644 --- a/shell/browser/api/electron_api_browser_window.h +++ b/shell/browser/api/electron_api_browser_window.h @@ -61,6 +61,7 @@ class BrowserWindow : public TopLevelWindow, // NativeWindowObserver: void RequestPreferredWidth(int* width) override; void OnCloseButtonClicked(bool* prevent_default) override; + void OnWindowIsKeyChanged(bool is_key) override; // TopLevelWindow: void OnWindowClosed() override; diff --git a/shell/browser/native_window.cc b/shell/browser/native_window.cc index 6d58d84810a5d..760d3aba91f8a 100644 --- a/shell/browser/native_window.cc +++ b/shell/browser/native_window.cc @@ -439,6 +439,11 @@ void NativeWindow::NotifyWindowFocus() { observer.OnWindowFocus(); } +void NativeWindow::NotifyWindowIsKeyChanged(bool is_key) { + for (NativeWindowObserver& observer : observers_) + observer.OnWindowIsKeyChanged(is_key); +} + void NativeWindow::NotifyWindowShow() { for (NativeWindowObserver& observer : observers_) observer.OnWindowShow(); diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index 5d491d3cb1657..9b8f042d17c2d 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -259,6 +259,7 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowBlur(); void NotifyWindowFocus(); void NotifyWindowShow(); + void NotifyWindowIsKeyChanged(bool is_key); void NotifyWindowHide(); void NotifyWindowMaximize(); void NotifyWindowUnmaximize(); diff --git a/shell/browser/native_window_observer.h b/shell/browser/native_window_observer.h index 6310344ba4262..92cada74f1c17 100644 --- a/shell/browser/native_window_observer.h +++ b/shell/browser/native_window_observer.h @@ -57,6 +57,9 @@ class NativeWindowObserver : public base::CheckedObserver { // Called when window gains focus. virtual void OnWindowFocus() {} + // Called when window gained or lost key window status. + virtual void OnWindowIsKeyChanged(bool is_key) {} + // Called when window is shown. virtual void OnWindowShow() {} diff --git a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm index e7d5957774b88..72b46185e75d2 100644 --- a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm +++ b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm @@ -97,6 +97,21 @@ - (void)windowDidResignMain:(NSNotification*)notification { shell_->NotifyWindowBlur(); } +- (void)windowDidBecomeKey:(NSNotification*)notification { + shell_->NotifyWindowIsKeyChanged(true); +} + +- (void)windowDidResignKey:(NSNotification*)notification { + // If our app is still active and we're still the key window, ignore this + // message, since it just means that a menu extra (on the "system status bar") + // was activated; we'll get another |-windowDidResignKey| if we ever really + // lose key window status. + if ([NSApp isActive] && ([NSApp keyWindow] == [notification object])) + return; + + shell_->NotifyWindowIsKeyChanged(false); +} + - (NSSize)windowWillResize:(NSWindow*)sender toSize:(NSSize)frameSize { NSSize newSize = frameSize; double aspectRatio = shell_->GetAspectRatio();