diff --git a/electron/gameWindow.js b/electron/gameWindow.js index fb14326d4..6a60b330d 100644 --- a/electron/gameWindow.js +++ b/electron/gameWindow.js @@ -8,6 +8,7 @@ const api = require("./api-server"); const cp = require("child_process"); const path = require("path"); const fs = require("fs"); +const { windowTracker } = require("./windowTracker"); const { fileURLToPath } = require("url"); const debug = process.argv.includes("--debug"); @@ -20,18 +21,28 @@ async function createWindow(killall) { icon = path.join(__dirname, 'icon.png'); } + const tracker = windowTracker('main'); const window = new BrowserWindow({ icon, show: false, backgroundThrottling: false, backgroundColor: "#000000", + title: 'Bitburner', + x: tracker.state.x, + y: tracker.state.y, + width: tracker.state.width, + height: tracker.state.height, + minWidth: 600, + minHeight: 400, webPreferences: { nativeWindowOpen: true, }, }); + setTimeout(() => tracker.track(window), 1000); + if (tracker.state.isMaximized) window.maximize(); + window.removeMenu(); - window.maximize(); noScripts = killall ? { query: { noScripts: killall } } : {}; window.loadFile("index.html", noScripts); window.show(); diff --git a/electron/windowTracker.js b/electron/windowTracker.js new file mode 100644 index 000000000..563822177 --- /dev/null +++ b/electron/windowTracker.js @@ -0,0 +1,63 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { screen } = require("electron"); +const log = require("electron-log"); +const debounce = require("lodash/debounce"); +const Config = require("electron-config"); +const config = new Config(); + +// https://stackoverflow.com/a/68627253 +const windowTracker = (windowName) => { + let window, windowState; + + const setBounds = () => { + // Restore from appConfig + if (config.has(`window.${windowName}`)) { + windowState = config.get(`window.${windowName}`); + return; + } + + const size = screen.getPrimaryDisplay().workAreaSize; + + // Default + windowState = { + x: undefined, + y: undefined, + width: size.width, + height: size.height, + isMaximized: true, + }; + }; + + const saveState = debounce(() => { + if (!windowState.isMaximized) { + windowState = window.getBounds(); + } + + windowState.isMaximized = window.isMaximized(); + log.silly(`Saving window.${windowName} to configs`); + config.set(`window.${windowName}`, windowState); + log.silly(windowState); + }, 1000); + + const track = (win) => { + window = win; + ['resize', 'move', 'close'].forEach((event) => { + win.on(event, saveState); + }); + }; + + setBounds(); + + return { + state: { + x: windowState.x, + y: windowState.y, + width: windowState.width, + height: windowState.height, + isMaximized: windowState.isMaximized, + }, + track, + }; +}; + +module.exports = { windowTracker };