60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
import {app, screen} from 'electron';
|
|
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
const baseDir = path.join(app.getPath('userData'), 'data');
|
|
const windowStatePath = path.join(baseDir, 'window.json');
|
|
|
|
interface SavedWindowState {
|
|
x?: number
|
|
y?: number
|
|
height: number
|
|
width: number
|
|
maximized: boolean
|
|
}
|
|
|
|
function mapToScreen(state: SavedWindowState): SavedWindowState {
|
|
let x = state.x !== undefined ? state.x : 0;
|
|
let y = state.y !== undefined ? state.y : 0;
|
|
const primaryDisplay = screen.getPrimaryDisplay();
|
|
const targetDisplay = screen.getDisplayMatching({x, y, height: state.height, width: state.width});
|
|
if(primaryDisplay.scaleFactor !== 1 && targetDisplay.id !== primaryDisplay.id) {
|
|
x /= primaryDisplay.scaleFactor;
|
|
y /= primaryDisplay.scaleFactor;
|
|
}
|
|
state.x = x !== 0 ? x : undefined;
|
|
state.y = y !== 0 ? y : undefined;
|
|
return state;
|
|
}
|
|
|
|
export function setSavedWindowState(window: Electron.BrowserWindow): void {
|
|
const bounds = window.getBounds();
|
|
const maximized = window.isMaximized();
|
|
const windowState: SavedWindowState = {
|
|
height: bounds.height,
|
|
maximized,
|
|
width: bounds.width,
|
|
x: bounds.x,
|
|
y: bounds.y
|
|
};
|
|
fs.writeFileSync(windowStatePath, JSON.stringify(windowState));
|
|
}
|
|
|
|
export function getSavedWindowState(): SavedWindowState {
|
|
const defaultState = {
|
|
height: 768,
|
|
maximized: false,
|
|
width: 1024
|
|
};
|
|
if(!fs.existsSync(windowStatePath))
|
|
return defaultState;
|
|
try {
|
|
let savedState = <SavedWindowState>JSON.parse(fs.readFileSync(windowStatePath, 'utf-8'));
|
|
savedState = mapToScreen(savedState);
|
|
return savedState;
|
|
} catch (e) {
|
|
log.error(e);
|
|
return defaultState;
|
|
}
|
|
} |