From 444ad26f89fbf32696721a2270b54c0fcd8cb8b3 Mon Sep 17 00:00:00 2001 From: Cyrus Roshan Date: Tue, 2 Feb 2021 04:24:04 -0800 Subject: [PATCH] feat: add option to not transform processes on win.SetVisibleOnAllWorkspaces (#27200) * fix: optionally transform processes on win.SetVisibleOnAllWorkspaces on macOS, making it backwards-compatible with v9.2.1 (#27101) * fix: optionally transform processes on win.SetVisibleOnAllWorkspaces on macOS, making it backwards-compatible with v9.2.1 (#27101) Co-authored-by: Cyrus Roshan --- docs/api/browser-window.md | 9 ++++++++- shell/browser/api/electron_api_base_window.cc | 6 +++++- shell/browser/native_window.h | 6 ++++-- shell/browser/native_window_mac.h | 3 ++- shell/browser/native_window_mac.mm | 19 +++++++++++-------- shell/browser/native_window_views.cc | 6 ++++-- shell/browser/native_window_views.h | 3 ++- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 8b22d4d2c57e..8aa97ee20320 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -1624,7 +1624,14 @@ Returns `Boolean` - Whether the menu bar is visible. * `visible` Boolean * `options` Object (optional) * `visibleOnFullScreen` Boolean (optional) _macOS_ - Sets whether - the window should be visible above fullscreen windows + the window should be visible above fullscreen windows. + * `skipTransformProcessType` Boolean (optional) _macOS_ - Calling + setVisibleOnAllWorkspaces will by default transform the process + type between UIElementApplication and ForegroundApplication to + ensure the correct behavior. However, this will hide the window + and dock for a short time every time it is called. If your window + is already of type UIElementApplication, you can bypass this + transformation by passing true to skipTransformProcessType. Sets whether the window should be visible on all workspaces. diff --git a/shell/browser/api/electron_api_base_window.cc b/shell/browser/api/electron_api_base_window.cc index 4540e50239c5..9bbbe4c7275c 100644 --- a/shell/browser/api/electron_api_base_window.cc +++ b/shell/browser/api/electron_api_base_window.cc @@ -825,9 +825,13 @@ void BaseWindow::SetVisibleOnAllWorkspaces(bool visible, gin_helper::Arguments* args) { gin_helper::Dictionary options; bool visibleOnFullScreen = false; + bool skipTransformProcessType = false; args->GetNext(&options) && options.Get("visibleOnFullScreen", &visibleOnFullScreen); - return window_->SetVisibleOnAllWorkspaces(visible, visibleOnFullScreen); + args->GetNext(&options) && + options.Get("skipTransformProcessType", &skipTransformProcessType); + return window_->SetVisibleOnAllWorkspaces(visible, visibleOnFullScreen, + skipTransformProcessType); } bool BaseWindow::IsVisibleOnAllWorkspaces() { diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index 6944f397e7d9..d38ce8bb9998 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -187,8 +187,10 @@ class NativeWindow : public base::SupportsUserData, const std::string& description) = 0; // Workspace APIs. - virtual void SetVisibleOnAllWorkspaces(bool visible, - bool visibleOnFullScreen = false) = 0; + virtual void SetVisibleOnAllWorkspaces( + bool visible, + bool visibleOnFullScreen = false, + bool skipTransformProcessType = false) = 0; virtual bool IsVisibleOnAllWorkspaces() = 0; diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index 92dee07ab30c..cbd926cabc12 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -113,7 +113,8 @@ class NativeWindowMac : public NativeWindow, public ui::NativeThemeObserver { void SetOverlayIcon(const gfx::Image& overlay, const std::string& description) override; void SetVisibleOnAllWorkspaces(bool visible, - bool visibleOnFullScreen) override; + bool visibleOnFullScreen, + bool skipTransformProcessType) override; bool IsVisibleOnAllWorkspaces() override; void SetAutoHideCursor(bool auto_hide) override; void SetVibrancy(const std::string& type) override; diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index c2b423f5af47..6c89b6ecc04c 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -1161,18 +1161,21 @@ void NativeWindowMac::SetOverlayIcon(const gfx::Image& overlay, const std::string& description) {} void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible, - bool visibleOnFullScreen) { + bool visibleOnFullScreen, + bool skipTransformProcessType) { // In order for NSWindows to be visible on fullscreen we need to functionally // mimic app.dock.hide() since Apple changed the underlying functionality of // NSWindows starting with 10.14 to disallow NSWindows from floating on top of // fullscreen apps. - ProcessSerialNumber psn = {0, kCurrentProcess}; - if (visibleOnFullScreen) { - [window_ setCanHide:NO]; - TransformProcessType(&psn, kProcessTransformToUIElementApplication); - } else { - [window_ setCanHide:YES]; - TransformProcessType(&psn, kProcessTransformToForegroundApplication); + if (!skipTransformProcessType) { + ProcessSerialNumber psn = {0, kCurrentProcess}; + if (visibleOnFullScreen) { + [window_ setCanHide:NO]; + TransformProcessType(&psn, kProcessTransformToUIElementApplication); + } else { + [window_ setCanHide:YES]; + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + } } SetCollectionBehavior(visible, NSWindowCollectionBehaviorCanJoinAllSpaces); diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index b79cc3f370ec..dc6519f4c4d0 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -1231,8 +1231,10 @@ bool NativeWindowViews::IsMenuBarVisible() { return root_view_->IsMenuBarVisible(); } -void NativeWindowViews::SetVisibleOnAllWorkspaces(bool visible, - bool visibleOnFullScreen) { +void NativeWindowViews::SetVisibleOnAllWorkspaces( + bool visible, + bool visibleOnFullScreen, + bool skipTransformProcessType) { widget()->SetVisibleOnAllWorkspaces(visible); } diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index e1fff4a0d075..a9aebe7f630f 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -127,7 +127,8 @@ class NativeWindowViews : public NativeWindow, bool IsMenuBarVisible() override; void SetVisibleOnAllWorkspaces(bool visible, - bool visibleOnFullScreen) override; + bool visibleOnFullScreen, + bool skipTransformProcessType) override; bool IsVisibleOnAllWorkspaces() override;