From a9296229c8038f667ae93a3acb245e2093983453 Mon Sep 17 00:00:00 2001 From: Mitchell Cohen Date: Tue, 29 Mar 2022 21:34:07 -0400 Subject: [PATCH] feat: add app.isHidden API for macOS (#32155) * feat: add app.isHidden API * Update docs/api/app.md Co-authored-by: Samuel Maddock * fixed isHidden tests * Update docs/api/app.md Co-authored-by: John Kleinschmidt * Update spec-main/api-app-spec.ts Co-authored-by: John Kleinschmidt Co-authored-by: Samuel Maddock Co-authored-by: John Kleinschmidt --- docs/api/app.md | 4 ++++ shell/browser/api/electron_api_app.cc | 1 + shell/browser/browser.h | 1 + shell/browser/browser_mac.mm | 4 ++++ spec-main/api-app-spec.ts | 19 ++++++++++++++++++- 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/api/app.md b/docs/api/app.md index b8c4780b22..b01b218b18 100755 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -606,6 +606,10 @@ You should seek to use the `steal` option as sparingly as possible. Hides all application windows without minimizing them. +### `app.isHidden()` _macOS_ + +Returns `boolean` - `true` if the application—including all of its windows—is hidden (e.g. with `Command-H`), `false` otherwise. + ### `app.show()` _macOS_ Shows application windows after they were hidden. Does not automatically focus diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 353b8c3d67..73db1e756f 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -1769,6 +1769,7 @@ gin::ObjectTemplateBuilder App::GetObjectTemplateBuilder(v8::Isolate* isolate) { base::BindRepeating(&Browser::IsEmojiPanelSupported, browser)) #if BUILDFLAG(IS_MAC) .SetMethod("hide", base::BindRepeating(&Browser::Hide, browser)) + .SetMethod("isHidden", base::BindRepeating(&Browser::IsHidden, browser)) .SetMethod("show", base::BindRepeating(&Browser::Show, browser)) .SetMethod("setUserActivity", base::BindRepeating(&Browser::SetUserActivity, browser)) diff --git a/shell/browser/browser.h b/shell/browser/browser.h index 4a69bbd75d..c56cc3ce84 100755 --- a/shell/browser/browser.h +++ b/shell/browser/browser.h @@ -158,6 +158,7 @@ class Browser : public WindowListObserver { // Hide the application. void Hide(); + bool IsHidden(); // Show the application. void Show(); diff --git a/shell/browser/browser_mac.mm b/shell/browser/browser_mac.mm index cdd3ba7711..1094747b41 100644 --- a/shell/browser/browser_mac.mm +++ b/shell/browser/browser_mac.mm @@ -117,6 +117,10 @@ void Browser::Hide() { [[AtomApplication sharedApplication] hide:nil]; } +bool Browser::IsHidden() { + return [[AtomApplication sharedApplication] isHidden]; +} + void Browser::Show() { [[AtomApplication sharedApplication] unhide:nil]; } diff --git a/spec-main/api-app-spec.ts b/spec-main/api-app-spec.ts index f4337d224b..4de2ca2a0d 100644 --- a/spec-main/api-app-spec.ts +++ b/spec-main/api-app-spec.ts @@ -9,7 +9,7 @@ import { promisify } from 'util'; import { app, BrowserWindow, Menu, session, net as electronNet } from 'electron/main'; import { emittedOnce } from './events-helpers'; import { closeWindow, closeAllWindows } from './window-helpers'; -import { ifdescribe, ifit } from './spec-helpers'; +import { ifdescribe, ifit, waitUntil } from './spec-helpers'; import split = require('split') const fixturesPath = path.resolve(__dirname, '../spec/fixtures'); @@ -1575,6 +1575,23 @@ describe('app module', () => { }); }); + ifdescribe(process.platform === 'darwin')('app hide and show API', () => { + describe('app.isHidden', () => { + it('returns true when the app is hidden', async () => { + app.hide(); + await expect( + waitUntil(() => app.isHidden()) + ).to.eventually.be.fulfilled(); + }); + it('returns false when the app is shown', async () => { + app.show(); + await expect( + waitUntil(() => !app.isHidden()) + ).to.eventually.be.fulfilled(); + }); + }); + }); + const dockDescribe = process.platform === 'darwin' ? describe : describe.skip; dockDescribe('dock APIs', () => { after(async () => {