diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
new file mode 100644
index 00000000..26801ebb
--- /dev/null
+++ b/.github/workflows/backport.yml
@@ -0,0 +1,16 @@
+name: Backport
+on:
+ pull_request:
+ types:
+ - closed
+ - labeled
+
+jobs:
+ backport:
+ runs-on: ubuntu-18.04
+ name: Backport
+ steps:
+ - name: Backport
+ uses: tibdex/backport@v1
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml
new file mode 100644
index 00000000..e90b599b
--- /dev/null
+++ b/.github/workflows/label.yml
@@ -0,0 +1,19 @@
+# This workflow will triage pull requests and apply a label based on the
+# paths that are modified in the pull request.
+#
+# To use this workflow, you will need to set up a .github/labeler.yml
+# file with configuration. For more information, see:
+# https://github.com/actions/labeler/blob/master/README.md
+
+name: Labeler
+on: [pull_request]
+
+jobs:
+ label:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/labeler@v2
+ with:
+ repo-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 00000000..7bbc0505
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,19 @@
+name: Mark stale issues and pull requests
+
+on:
+ schedule:
+ - cron: "0 0 * * *"
+
+jobs:
+ stale:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/stale@v1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ stale-issue-message: 'Stale issue message'
+ stale-pr-message: 'Stale pull request message'
+ stale-issue-label: 'no-issue-activity'
+ stale-pr-label: 'no-pr-activity'
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 c10969b5..5b5f04e2 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "symphony",
"productName": "Symphony",
- "version": "6.0.0",
+ "version": "6.1.0",
"clientVersion": "2.0.1",
"buildNumber": "0",
"searchAPIVersion": "1.55.3",
@@ -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);
+ }
};
/**