Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport 23.4.x fixes #1883

Merged
merged 9 commits into from
Jun 27, 2023
10 changes: 8 additions & 2 deletions src/app/app-cache-handler.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { app, BrowserWindow, dialog, session } from 'electron';
import {
app,
BrowserWindow,
dialog,
MessageBoxOptions,
session,
} from 'electron';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
Expand Down Expand Up @@ -103,7 +109,7 @@ export const cleanAppCacheOnCrash = (window: BrowserWindow): void => {
) {
return;
}
const options: Electron.MessageBoxOptions = {
const options: MessageBoxOptions = {
type: 'question',
title: i18n.t('Relaunch Application')(),
message: i18n.t(
Expand Down
6 changes: 3 additions & 3 deletions src/app/dialog-handler.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { app, BrowserWindow, dialog } from 'electron';
import { app, BrowserWindow, dialog, MessageBoxOptions } from 'electron';

import { i18n } from '../common/i18n';
import { logger } from '../common/logger';
Expand Down Expand Up @@ -178,7 +178,7 @@ export const titleBarChangeDialog = async (
if (!focusedWindow || !windowExists(focusedWindow)) {
return;
}
const options: Electron.MessageBoxOptions = {
const options: MessageBoxOptions = {
type: 'question',
title: i18n.t('Relaunch Application')(),
message: i18n.t(
Expand Down Expand Up @@ -208,7 +208,7 @@ export const restartDialog = async (configFields: any) => {
if (!focusedWindow || !windowExists(focusedWindow)) {
return;
}
const options: Electron.MessageBoxOptions = {
const options: MessageBoxOptions = {
type: 'question',
title: i18n.t('Relaunch Application')(),
message: i18n.t(
Expand Down
80 changes: 45 additions & 35 deletions src/app/screen-snippet-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import * as path from 'path';

import { ChildProcess, execFile, ExecFileException } from 'child_process';
import * as util from 'util';
import { IScreenSnippet } from '../common/api-interface';
import { apiName, IScreenSnippet } from '../common/api-interface';
import {
isDevEnv,
isElectronQA,
Expand Down Expand Up @@ -95,7 +95,7 @@ class ScreenSnippet {
const currentWindowName = (currentWindowObj as ICustomBrowserWindow)
?.winName;
const mainWindow = windowHandler.getMainWindow();

windowHandler.closeSnippingToolWindow();
if (hideOnCapture) {
this.storeWindowsState(mainWindow, currentWindowObj);
winStore.hideWindowsOnCapturing(hideOnCapture);
Expand Down Expand Up @@ -465,44 +465,54 @@ class ScreenSnippet {
const windowObj = winStore.getWindowStore();
const currentWindowName = (currentWindowObj as ICustomBrowserWindow)
?.winName;
if (windowObj.windows.length < 1) {
const allWindows = BrowserWindow.getAllWindows();
let windowsArr: IWindowState[] = [];
const mainArr: IWindowState[] = [
{
id: 'main',
focused: mainWindow?.isFocused(),
minimized: mainWindow?.isMinimized(),
},
];

allWindows.forEach((window) => {
if (
(window as ICustomBrowserWindow).winName !== currentWindowName &&
(window as ICustomBrowserWindow).winName !== 'main'
) {
windowsArr.push({
id: (window as ICustomBrowserWindow).winName,
focused: window.isFocused(),
minimized: window?.isMinimized(),
});
}
});

if (currentWindowName !== 'main') {
if (windowObj.windows.length > 0) {
winStore.destroyWindowStore();
}
const allWindows = BrowserWindow.getAllWindows();
let windowsArr: IWindowState[] = [];
const mainArr: IWindowState[] = [
{
id: 'main',
focused: mainWindow?.isFocused(),
minimized: mainWindow?.isMinimized(),
isFullScreen: mainWindow?.isFullScreen(),
isVisible: mainWindow?.isVisible(),
},
];

allWindows.forEach((window) => {
if (
(window as ICustomBrowserWindow).winName &&
(window as ICustomBrowserWindow).winName !== currentWindowName &&
(window as ICustomBrowserWindow).winName !== 'main' &&
(window as ICustomBrowserWindow).winName !==
apiName.notificationWindowName
) {
windowsArr.push({
id: currentWindowName,
focused: currentWindowObj?.isFocused(),
minimized: currentWindowObj?.isMinimized(),
id: (window as ICustomBrowserWindow).winName,
focused: window.isFocused(),
minimized: window?.isMinimized(),
isFullScreen: window?.isFullScreen(),
isVisible: window?.isVisible(),
});
windowsArr = mainArr.concat(windowsArr);
} else {
windowsArr = windowsArr.concat(mainArr);
}
winStore.setWindowStore({
windows: windowsArr,
});

if (currentWindowName !== 'main') {
windowsArr.push({
id: currentWindowName,
focused: currentWindowObj?.isFocused(),
minimized: currentWindowObj?.isMinimized(),
isFullScreen: currentWindowObj?.isFullScreen(),
isVisible: currentWindowObj?.isVisible(),
});
windowsArr = mainArr.concat(windowsArr);
} else {
windowsArr = windowsArr.concat(mainArr);
}
winStore.setWindowStore({
windows: windowsArr,
});
};

/**
Expand Down
39 changes: 34 additions & 5 deletions src/app/stores/window-store.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BrowserWindow } from 'electron';
import { presenceStatusStore } from '.';
import { apiName } from '../../common/api-interface';
import { isMac, isWindowsOS } from '../../common/env';
import { logger } from '../../common/logger';
import { presenceStatus } from '../presence-status-handler';
Expand All @@ -15,6 +16,7 @@ export interface IWindowState {
minimized?: boolean;
focused?: boolean;
isFullScreen?: boolean;
isVisible?: boolean;
}

export class WindowStore {
Expand Down Expand Up @@ -47,17 +49,25 @@ export class WindowStore {

currentWindows.forEach((currentWindow) => {
const isFullScreen = currentWindow.isFullScreen();
if (isFullScreen) {
this.hideFullscreenWindow(currentWindow);
} else {
currentWindow?.hide();
const isMinimized = currentWindow.isMinimized();
if (
(currentWindow as ICustomBrowserWindow).winName !==
apiName.notificationWindowName
) {
if (isFullScreen) {
this.hideFullscreenWindow(currentWindow);
// No need to hide minimized windows
} else if (!isMinimized) {
currentWindow?.hide();
}
}
});
}
};

public restoreWindows = (hideOnCapture?: boolean) => {
if (hideOnCapture) {
this.restoreNotificationProperties();
const storedWindows = this.getWindowStore();
let currentWindow = storedWindows.windows.find(
(currentWindow) => currentWindow.focused,
Expand All @@ -75,7 +85,7 @@ export class WindowStore {
const fullscreenedWindows: IWindowState[] = [];
// Restoring all windows except focused one
storedWindows.windows.forEach((currentWindow) => {
if (currentWindow) {
if (currentWindow && currentWindow.isVisible) {
const window: ICustomBrowserWindow | undefined = getWindowByName(
currentWindow.id || '',
) as ICustomBrowserWindow;
Expand Down Expand Up @@ -119,6 +129,25 @@ export class WindowStore {
}
};

/**
* Restores notification properties reset to default post hiding main window
* @param windowsNames
*/
private restoreNotificationProperties = () => {
const windows = BrowserWindow.getAllWindows();

windows
.filter(
(window) =>
(window as ICustomBrowserWindow).winName ===
apiName.notificationWindowName,
)
.map((notificationWindow) => {
notificationWindow.setAlwaysOnTop(true);
notificationWindow.setSkipTaskbar(true);
});
};

private hideFullscreenWindow = (window: BrowserWindow) => {
window.once('leave-full-screen', () => {
if (isMac) {
Expand Down
4 changes: 2 additions & 2 deletions src/app/version-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,10 @@ class VersionHandler {
/* Get SFE version */
let urlSfeVersion: string;
let newUrlSfeVersion: string;
urlSfeVersion = mainUrl?.includes('/daily/')
urlSfeVersion = mainUrl?.includes('/daily')
? `${protocol}//${hostname}/bff-daily/daily/version.json`
: `${protocol}//${hostname}/client-bff/version.json`;
newUrlSfeVersion = mainUrl?.includes('/daily/')
newUrlSfeVersion = mainUrl?.includes('/daily')
? `${protocol}//${hostname}/apps/client2/daily/info`
: `${protocol}//${hostname}/apps/client2/info`;
const sfeVersionInfo: string = mainUrl?.includes('client2')
Expand Down
1 change: 1 addition & 0 deletions src/app/window-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ export const updateAlwaysOnTop = async (
}
if (browserWins.length > 0) {
browserWins
.filter((browser) => browser && windowExists(browser))
.filter((browser) => typeof browser.notificationData !== 'object')
.forEach((browser) => browser.setAlwaysOnTop(shouldSetAlwaysOnTop));

Expand Down
12 changes: 9 additions & 3 deletions src/app/window-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ export class WindowHandler {
private screenSharingFrameWindow: Electron.BrowserWindow | null = null;
private basicAuthWindow: Electron.BrowserWindow | null = null;
private notificationSettingsWindow: Electron.BrowserWindow | null = null;
private snippingToolWindow: Electron.BrowserWindow | null = null;
private snippingToolWindow: ICustomBrowserWindow | null = null;
private finishedLoading: boolean = false;
private readonly opts: Electron.BrowserViewConstructorOptions | undefined;
private hideOnCapture: boolean = false;
Expand Down Expand Up @@ -1141,7 +1141,7 @@ export class WindowHandler {
/**
* Creates a about app window
*/
public createAboutAppWindow(windowName: string): void {
public async createAboutAppWindow(windowName: string): Promise<void> {
// This prevents creating multiple instances of the
// about window
if (didVerifyAndRestoreWindow(this.aboutAppWindow)) {
Expand Down Expand Up @@ -1176,6 +1176,8 @@ export class WindowHandler {
}
};

await versionHandler.getClientVersion(true, this.url);

if (
this.mainWindow &&
windowExists(this.mainWindow) &&
Expand Down Expand Up @@ -1362,7 +1364,11 @@ export class WindowHandler {
opts.modal = true;
}

this.snippingToolWindow = createComponentWindow('snipping-tool', opts);
this.snippingToolWindow = createComponentWindow(
'snipping-tool',
opts,
) as ICustomBrowserWindow;
this.snippingToolWindow.winName = apiName.snippingToolWindowName;
this.moveWindow(this.snippingToolWindow, undefined, parentWindow);
this.snippingToolWindow.setVisibleOnAllWorkspaces(true);

Expand Down
3 changes: 3 additions & 0 deletions src/app/window-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,9 @@ export const didVerifyAndRestoreWindow = (
if (browserWindow.isMinimized()) {
browserWindow.restore();
}
if (!browserWindow.isVisible()) {
browserWindow.show();
}
browserWindow.focus();
return true;
};
Expand Down
1 change: 1 addition & 0 deletions src/common/api-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ export enum apiName {
mainWindowName = 'main',
notificationWindowName = 'notification-window',
welcomeScreenName = 'welcome-screen',
snippingToolWindowName = 'snipping-tool-window',
}

export const NOTIFICATION_WINDOW_TITLE = 'Notification - Symphony';
Expand Down
Loading