diff --git a/entitlements.mac.plist b/entitlements.mac.plist new file mode 100644 index 00000000..fdba46cc --- /dev/null +++ b/entitlements.mac.plist @@ -0,0 +1,13 @@ + + + + + com.apple.security.cs.allow-jit + com.apple.security.cs.allow-unsigned-executable-memory + com.apple.security.cs.allow-dyld-environment-variables + com.apple.security.device.audio-input + com.apple.security.device.camera + com.apple.security.files.user-selected.read-write + com.apple.security.network.client + + \ No newline at end of file diff --git a/package.json b/package.json index b9f4694a..5b5f04e2 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,9 @@ ], "mac": { "category": "public.app-category.business", - "icon": "images/icon.icns" + "icon": "images/icon.icns", + "entitlements": "entitlements.mac.plist", + "entitlementsInherit": "entitlements.mac.plist" }, "win": { "icon": "images/icon.ico", diff --git a/src/app/window-actions.ts b/src/app/window-actions.ts index 8229b896..5e9b7abf 100644 --- a/src/app/window-actions.ts +++ b/src/app/window-actions.ts @@ -144,10 +144,13 @@ export const activate = (windowName: string, shouldFocus: boolean = true): void /** * Sets always on top property based on isAlwaysOnTop * - * @param shouldSetAlwaysOnTop - * @param shouldActivateMainWindow + * @param shouldSetAlwaysOnTop {boolean} - Whether to enable always on top or not + * @param shouldActivateMainWindow {boolean} - Whether to active main window */ -export const updateAlwaysOnTop = async (shouldSetAlwaysOnTop: boolean, shouldActivateMainWindow: boolean = true): Promise => { +export const updateAlwaysOnTop = async ( + shouldSetAlwaysOnTop: boolean, + shouldActivateMainWindow: boolean = true, +): Promise => { logger.info(`window-actions: Should we set always on top? ${shouldSetAlwaysOnTop}!`); const browserWins: ICustomBrowserWindow[] = BrowserWindow.getAllWindows() as ICustomBrowserWindow[]; await config.updateUserConfig({ alwaysOnTop: shouldSetAlwaysOnTop }); @@ -198,6 +201,18 @@ export const handleKeyPress = (key: number): void => { } }; +/** + * Sets the window to always on top based + * on fullscreen state + */ +const setSpecificAlwaysOnTop = () => { + const browserWindow = BrowserWindow.getFocusedWindow(); + if (isMac && browserWindow && windowExists(browserWindow) && browserWindow.isAlwaysOnTop()) { + // Set the focused window's always on top level based on fullscreen state + browserWindow.setAlwaysOnTop(true, browserWindow.isFullScreen() ? 'modal-panel' : 'floating'); + } +}; + /** * Monitors window actions * @@ -223,6 +238,13 @@ export const monitorWindowActions = (window: BrowserWindow): void => { if ((window as ICustomBrowserWindow).winName === apiName.mainWindowName) { window.on('restore', throttledWindowRestore); } + + // Workaround for an issue with MacOS + AlwaysOnTop + // Issue: SDA-1665 + if (isMac) { + window.on('enter-full-screen', setSpecificAlwaysOnTop); + window.on('leave-full-screen', setSpecificAlwaysOnTop); + } }; /** @@ -246,6 +268,13 @@ export const removeWindowEventListener = (window: BrowserWindow): void => { window.removeListener('leave-full-screen', throttledWindowChanges); window.removeListener('unmaximize', throttledWindowChanges); + + // Workaround for and issue with MacOS + AlwaysOnTop + // Issue: SDA-1665 + if (isMac) { + window.removeListener('enter-full-screen', setSpecificAlwaysOnTop); + window.removeListener('leave-full-screen', setSpecificAlwaysOnTop); + } }; /**