Browse Source

feat: Implement BrowserWindow.setFocusable on macOS (#19033)

It was not implemented on Mac despite being available as a constructor
option. Implementation already exists on Windows. Linux case can be
separately.

https://github.com/electron/electron/issues/19032

Notes: Implemented BrowserWindow.setFocusable on macOS.
Julien Isorce 5 years ago
parent
commit
09c3277b42

+ 3 - 1
docs/api/browser-window.md

@@ -1551,12 +1551,14 @@ Prevents the window contents from being captured by other apps.
 On macOS it sets the NSWindow's sharingType to NSWindowSharingNone.
 On Windows it calls SetWindowDisplayAffinity with `WDA_MONITOR`.
 
-#### `win.setFocusable(focusable)` _Windows_
+#### `win.setFocusable(focusable)` _macOS_ _Windows_
 
 * `focusable` Boolean
 
 Changes whether the window can be focused.
 
+On macOS it does not remove the focus from the window.
+
 #### `win.setParentWindow(parent)`
 
 * `parent` BrowserWindow

+ 1 - 0
shell/browser/native_window_mac.h

@@ -104,6 +104,7 @@ class NativeWindowMac : public NativeWindow {
   bool IsDocumentEdited() override;
   void SetIgnoreMouseEvents(bool ignore, bool forward) override;
   void SetContentProtection(bool enable) override;
+  void SetFocusable(bool focusable) override;
   void AddBrowserView(NativeBrowserView* browser_view) override;
   void RemoveBrowserView(NativeBrowserView* browser_view) override;
   void SetParentWindow(NativeWindow* parent) override;

+ 7 - 0
shell/browser/native_window_mac.mm

@@ -1076,6 +1076,13 @@ void NativeWindowMac::SetContentProtection(bool enable) {
       setSharingType:enable ? NSWindowSharingNone : NSWindowSharingReadOnly];
 }
 
+void NativeWindowMac::SetFocusable(bool focusable) {
+  // No known way to unfocus the window if it had the focus. Here we do not
+  // want to call Focus(false) because it moves the window to the back, i.e.
+  // at the bottom in term of z-order.
+  [window_ setDisableKeyOrMainWindow:!focusable];
+}
+
 void NativeWindowMac::AddBrowserView(NativeBrowserView* view) {
   [CATransaction begin];
   [CATransaction setDisableActions:YES];