Fix window issues (#2730)

* Fixed the issue where the window doesn't remember the last window state

* Fixed issue with unsnapping windows on switching server on Windows

* Fix tests
This commit is contained in:
Devin Binnie 2023-05-25 09:01:12 -04:00 committed by GitHub
parent ae4a8dca1f
commit 66b611bb1a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 8 deletions

View file

@ -495,14 +495,35 @@ describe('main/windows/mainWindow', () => {
afterEach(() => { afterEach(() => {
mainWindow.ready = false; mainWindow.ready = false;
mainWindow.win.visible = false;
jest.resetAllMocks(); jest.resetAllMocks();
}); });
it('should show main window and focus it if it is exists', () => { it('should show main window if it is exists on macOS/Linux', () => {
const originalPlatform = process.platform;
Object.defineProperty(process, 'platform', {
value: 'darwin',
});
mainWindow.ready = true; mainWindow.ready = true;
mainWindow.show(); mainWindow.show();
expect(mainWindow.win.show).toHaveBeenCalled(); expect(mainWindow.win.show).toHaveBeenCalled();
Object.defineProperty(process, 'platform', {
value: originalPlatform,
});
});
it('should focus main window if it exists and is visible on Windows', () => {
const originalPlatform = process.platform;
Object.defineProperty(process, 'platform', {
value: 'win32',
});
mainWindow.ready = true;
mainWindow.win.visible = true;
mainWindow.show();
expect(mainWindow.win.focus).toHaveBeenCalled(); expect(mainWindow.win.focus).toHaveBeenCalled();
Object.defineProperty(process, 'platform', {
value: originalPlatform,
});
}); });
it('should init if the main window does not exist', () => { it('should init if the main window does not exist', () => {

View file

@ -47,7 +47,7 @@ const ALT_MENU_KEYS = ['Alt+F', 'Alt+E', 'Alt+V', 'Alt+H', 'Alt+W', 'Alt+P'];
export class MainWindow extends EventEmitter { export class MainWindow extends EventEmitter {
private win?: BrowserWindow; private win?: BrowserWindow;
private savedWindowState: SavedWindowState; private savedWindowState?: SavedWindowState;
private ready: boolean; private ready: boolean;
private isResizing: boolean; private isResizing: boolean;
private lastEmittedBounds?: Electron.Rectangle private lastEmittedBounds?: Electron.Rectangle
@ -58,7 +58,6 @@ export class MainWindow extends EventEmitter {
// Create the browser window. // Create the browser window.
this.ready = false; this.ready = false;
this.isResizing = false; this.isResizing = false;
this.savedWindowState = this.getSavedWindowState();
ipcMain.handle(GET_FULL_SCREEN_STATUS, () => this.win?.isFullScreen()); ipcMain.handle(GET_FULL_SCREEN_STATUS, () => this.win?.isFullScreen());
ipcMain.on(VIEW_FINISHED_RESIZING, this.handleViewFinishedResizing); ipcMain.on(VIEW_FINISHED_RESIZING, this.handleViewFinishedResizing);
@ -69,6 +68,9 @@ export class MainWindow extends EventEmitter {
} }
init = () => { init = () => {
// Can't call this before the app is ready
this.savedWindowState = this.getSavedWindowState();
const windowOptions: BrowserWindowConstructorOptions = Object.assign({}, this.savedWindowState, { const windowOptions: BrowserWindowConstructorOptions = Object.assign({}, this.savedWindowState, {
title: app.name, title: app.name,
fullscreenable: true, fullscreenable: true,
@ -107,7 +109,7 @@ export class MainWindow extends EventEmitter {
if (Config.hideOnStart === false) { if (Config.hideOnStart === false) {
this.win.show(); this.win.show();
if (this.savedWindowState.maximized) { if (this.savedWindowState?.maximized) {
this.win.maximize(); this.win.maximize();
} }
} }
@ -167,8 +169,19 @@ export class MainWindow extends EventEmitter {
show = () => { show = () => {
if (this.win && this.isReady) { if (this.win && this.isReady) {
this.win.show(); // There's a bug on Windows in Electron where if the window is snapped, it will unsnap when you call show()
// See here: https://github.com/electron/electron/issues/25359
// So to make sure we always show the window on macOS/Linux (need for workspace switching)
// We make an exception here
if (process.platform === 'win32') {
if (this.win.isVisible()) {
this.win.focus(); this.win.focus();
} else {
this.win.show();
}
} else {
this.win.show();
}
} else { } else {
this.init(); this.init();
} }
@ -224,7 +237,7 @@ export class MainWindow extends EventEmitter {
if (Config.startInFullscreen) { if (Config.startInFullscreen) {
return Config.startInFullscreen; return Config.startInFullscreen;
} }
return this.savedWindowState.fullscreen || false; return this.savedWindowState?.fullscreen || false;
} }
private isFramelessWindow = () => { private isFramelessWindow = () => {
@ -244,6 +257,8 @@ export class MainWindow extends EventEmitter {
throw new Error('Provided bounds info are outside the bounds of your screen, using defaults instead.'); throw new Error('Provided bounds info are outside the bounds of your screen, using defaults instead.');
} }
} catch (e) { } catch (e) {
log.error(e);
// Follow Electron's defaults, except for window dimensions which targets 1024x768 screen resolution. // Follow Electron's defaults, except for window dimensions which targets 1024x768 screen resolution.
savedWindowState = {width: DEFAULT_WINDOW_WIDTH, height: DEFAULT_WINDOW_HEIGHT}; savedWindowState = {width: DEFAULT_WINDOW_WIDTH, height: DEFAULT_WINDOW_HEIGHT};
} }