Browse Source

fix: macOS modal focus (#24286)

Shelley Vohr 4 years ago
parent
commit
af4876296c

+ 10 - 10
shell/browser/api/electron_api_browser_window.cc

@@ -284,22 +284,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
 
   BaseWindow::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
@@ -307,6 +299,14 @@ void BrowserWindow::OnWindowFocus() {
   BaseWindow::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())

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

@@ -66,6 +66,7 @@ class BrowserWindow : public BaseWindow,
   // NativeWindowObserver:
   void RequestPreferredWidth(int* width) override;
   void OnCloseButtonClicked(bool* prevent_default) override;
+  void OnWindowIsKeyChanged(bool is_key) override;
 
   // BaseWindow:
   void OnWindowClosed() override;

+ 5 - 0
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();

+ 1 - 0
shell/browser/native_window.h

@@ -257,6 +257,7 @@ class NativeWindow : public base::SupportsUserData,
   void NotifyWindowBlur();
   void NotifyWindowFocus();
   void NotifyWindowShow();
+  void NotifyWindowIsKeyChanged(bool is_key);
   void NotifyWindowHide();
   void NotifyWindowMaximize();
   void NotifyWindowUnmaximize();

+ 3 - 0
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() {}
 

+ 15 - 0
shell/browser/ui/cocoa/electron_ns_window_delegate.mm

@@ -97,6 +97,21 @@ using TitleBarStyle = electron::NativeWindowMac::TitleBarStyle;
   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();