feat: save window state when closing agent (#902)
This commit is contained in:
committed by
László Monda
parent
2c041b64ff
commit
12d361eb2e
@@ -18,6 +18,7 @@ import { AppService } from './services/app.service';
|
|||||||
import { SudoService } from './services/sudo.service';
|
import { SudoService } from './services/sudo.service';
|
||||||
import * as isDev from 'electron-is-dev';
|
import * as isDev from 'electron-is-dev';
|
||||||
import { setMenu } from './electron-menu';
|
import { setMenu } from './electron-menu';
|
||||||
|
import { loadWindowState, saveWindowState } from './util/window';
|
||||||
|
|
||||||
const optionDefinitions = [
|
const optionDefinitions = [
|
||||||
{name: 'addons', type: Boolean},
|
{name: 'addons', type: Boolean},
|
||||||
@@ -88,18 +89,28 @@ function createWindow() {
|
|||||||
|
|
||||||
logger.info(`[Electron Main] packagesDir: ${packagesDir}`);
|
logger.info(`[Electron Main] packagesDir: ${packagesDir}`);
|
||||||
|
|
||||||
|
const loadedWindowState = loadWindowState();
|
||||||
|
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
win = new BrowserWindow({
|
win = new BrowserWindow({
|
||||||
title: 'UHK Agent',
|
title: 'UHK Agent',
|
||||||
width: 1024,
|
x: loadedWindowState.x,
|
||||||
height: 768,
|
y: loadedWindowState.y,
|
||||||
|
width: loadedWindowState.width,
|
||||||
|
height: loadedWindowState.height,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
},
|
},
|
||||||
icon: path.join(__dirname, 'renderer/assets/images/agent-app-icon.png')
|
icon: path.join(__dirname, 'renderer/assets/images/agent-app-icon.png')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (loadedWindowState.isFullScreen) {
|
||||||
|
win.setFullScreen(true);
|
||||||
|
} else if (loadedWindowState.isMaximized) {
|
||||||
|
win.maximize();
|
||||||
|
}
|
||||||
|
|
||||||
setMenu(win);
|
setMenu(win);
|
||||||
win.maximize();
|
|
||||||
uhkHidDeviceService = new UhkHidDevice(logger, options, packagesDir);
|
uhkHidDeviceService = new UhkHidDevice(logger, options, packagesDir);
|
||||||
uhkOperations = new UhkOperations(logger, uhkHidDeviceService, packagesDir);
|
uhkOperations = new UhkOperations(logger, uhkHidDeviceService, packagesDir);
|
||||||
deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations, packagesDir);
|
deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations, packagesDir);
|
||||||
@@ -140,6 +151,10 @@ function createWindow() {
|
|||||||
win.webContents.on('crashed', (event: any) => {
|
win.webContents.on('crashed', (event: any) => {
|
||||||
logger.error(event);
|
logger.error(event);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
win.on('close', () => saveWindowState(win));
|
||||||
|
win.on('resize', () => saveWindowState(win));
|
||||||
|
win.on('move', () => saveWindowState(win));
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
|
|||||||
6
packages/uhk-agent/src/models/window-state.ts
Normal file
6
packages/uhk-agent/src/models/window-state.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { Rectangle } from 'electron';
|
||||||
|
|
||||||
|
export interface WindowState extends Rectangle {
|
||||||
|
isMaximized: boolean;
|
||||||
|
isFullScreen: boolean;
|
||||||
|
}
|
||||||
70
packages/uhk-agent/src/util/window.ts
Normal file
70
packages/uhk-agent/src/util/window.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import * as electron from 'electron';
|
||||||
|
import * as settings from 'electron-settings';
|
||||||
|
|
||||||
|
import { logger } from '../services/logger.service';
|
||||||
|
import { WindowState } from '../models/window-state';
|
||||||
|
|
||||||
|
const WINDOWS_SETTINGS_KEY = 'windowSettings';
|
||||||
|
|
||||||
|
export const windowVisibleFilter = (state: WindowState) => {
|
||||||
|
return (display: electron.Display): boolean => (
|
||||||
|
state.x >= display.bounds.x &&
|
||||||
|
state.y >= display.bounds.y &&
|
||||||
|
state.x <= display.bounds.width &&
|
||||||
|
state.y <= display.bounds.height
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const windowVisibleOnScreen = (state: WindowState): boolean => {
|
||||||
|
return electron.screen.getAllDisplays().some(windowVisibleFilter(state));
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getDefaultWindowState = () => ({
|
||||||
|
width: 1024,
|
||||||
|
height: 768,
|
||||||
|
isMaximized: true
|
||||||
|
});
|
||||||
|
|
||||||
|
export const loadWindowState = (): Partial<WindowState> => {
|
||||||
|
logger.log('[WindowState] load settings');
|
||||||
|
try {
|
||||||
|
const loadedState = settings.get(WINDOWS_SETTINGS_KEY) as any;
|
||||||
|
logger.log('[WindowState] loaded settings', loadedState);
|
||||||
|
|
||||||
|
if (!loadedState) {
|
||||||
|
logger.log('[WindowState]save state not exists, use default');
|
||||||
|
|
||||||
|
return getDefaultWindowState();
|
||||||
|
}
|
||||||
|
|
||||||
|
const visible = windowVisibleOnScreen(loadedState);
|
||||||
|
logger.log('[WindowState] loaded settings is visible', visible);
|
||||||
|
|
||||||
|
if (visible) {
|
||||||
|
logger.log('[WindowState] return with loaded settings');
|
||||||
|
return loadedState;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
logger.error('[WindowState] error when parsing loaded settings', err);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log('[WindowState] return with default settings');
|
||||||
|
|
||||||
|
return getDefaultWindowState();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const saveWindowState = (win: electron.BrowserWindow) => {
|
||||||
|
const winBounds = win.isMaximized() || win.isFullScreen()
|
||||||
|
? loadWindowState() as any
|
||||||
|
: win.getBounds();
|
||||||
|
|
||||||
|
const state: WindowState = {
|
||||||
|
...winBounds,
|
||||||
|
isMaximized: win.isMaximized(),
|
||||||
|
isFullScreen: win.isFullScreen()
|
||||||
|
};
|
||||||
|
|
||||||
|
logger.log('[WindowState] save settings:', state);
|
||||||
|
settings.set(WINDOWS_SETTINGS_KEY, state as any);
|
||||||
|
logger.log('[WindowState] save settings success');
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user