diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index f31bf86b..daba92fd 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -18,6 +18,7 @@ import { AppService } from './services/app.service'; import { SudoService } from './services/sudo.service'; import * as isDev from 'electron-is-dev'; import { setMenu } from './electron-menu'; +import { loadWindowState, saveWindowState } from './util/window'; const optionDefinitions = [ {name: 'addons', type: Boolean}, @@ -88,18 +89,28 @@ function createWindow() { logger.info(`[Electron Main] packagesDir: ${packagesDir}`); + const loadedWindowState = loadWindowState(); + // Create the browser window. win = new BrowserWindow({ title: 'UHK Agent', - width: 1024, - height: 768, + x: loadedWindowState.x, + y: loadedWindowState.y, + width: loadedWindowState.width, + height: loadedWindowState.height, webPreferences: { nodeIntegration: true }, 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); - win.maximize(); uhkHidDeviceService = new UhkHidDevice(logger, options, packagesDir); uhkOperations = new UhkOperations(logger, uhkHidDeviceService, packagesDir); deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations, packagesDir); @@ -140,6 +151,10 @@ function createWindow() { win.webContents.on('crashed', (event: any) => { 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 diff --git a/packages/uhk-agent/src/models/window-state.ts b/packages/uhk-agent/src/models/window-state.ts new file mode 100644 index 00000000..fa497846 --- /dev/null +++ b/packages/uhk-agent/src/models/window-state.ts @@ -0,0 +1,6 @@ +import { Rectangle } from 'electron'; + +export interface WindowState extends Rectangle { + isMaximized: boolean; + isFullScreen: boolean; +} diff --git a/packages/uhk-agent/src/util/window.ts b/packages/uhk-agent/src/util/window.ts new file mode 100644 index 00000000..a57cf6ba --- /dev/null +++ b/packages/uhk-agent/src/util/window.ts @@ -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 => { + 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'); +};