From 01e6533419a0a8caeb345dc3200de39a90756cd4 Mon Sep 17 00:00:00 2001 From: Antelle Date: Sun, 14 Feb 2016 16:17:17 +0300 Subject: [PATCH] save/restore window position after close --- electron/app.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++-- release-notes.md | 1 + 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/electron/app.js b/electron/app.js index d24eda00..1d100258 100644 --- a/electron/app.js +++ b/electron/app.js @@ -5,6 +5,7 @@ var app = require('app'), path = require('path'), + fs = require('fs'), BrowserWindow = require('browser-window'), Menu = require('menu'), Tray = require('tray'); @@ -14,7 +15,10 @@ var mainWindow = null, openFile = process.argv.filter(function(arg) { return /\.kdbx$/i.test(arg); })[0], ready = false, restartPending = false, - htmlPath = path.join(__dirname, 'index.html'); + htmlPath = path.join(__dirname, 'index.html'), + mainWindowPosition = {}, + updateMainWindowPositionTimeout = null, + windowPositionFileName = path.join(app.getPath('userData'), 'window-position.json'); process.argv.forEach(function(arg) { if (arg.lastIndexOf('--htmlpath=', 0) === 0) { @@ -83,7 +87,7 @@ app.getMainWindow = function() { function createMainWindow() { mainWindow = new BrowserWindow({ show: false, - width: 1000, height: 700, 'min-width': 600, 'min-height': 300, + width: 1000, height: 700, 'min-width': 700, 'min-height': 400, icon: path.join(__dirname, 'icon.png') }); setMenu(); @@ -95,12 +99,17 @@ function createMainWindow() { notifyOpenFile(); }, 50); }); + mainWindow.on('resize', delaySaveMainWindowPosition); + mainWindow.on('move', delaySaveMainWindowPosition); + mainWindow.on('close', updateMainWindowPositionIfPending); mainWindow.on('closed', function() { mainWindow = null; + saveMainWindowPosition(); }); mainWindow.on('minimize', function() { emitBackboneEvent('launcher-minimize'); }); + restoreMainWindowPosition(); } function restoreMainWindow() { @@ -116,6 +125,68 @@ function closeMainWindow() { emitBackboneEvent('launcher-exit-request'); } +function delaySaveMainWindowPosition() { + if (updateMainWindowPositionTimeout) { + clearTimeout(updateMainWindowPositionTimeout); + } + updateMainWindowPositionTimeout = setTimeout(updateMainWindowPosition, 500); +} + +function updateMainWindowPositionIfPending() { + if (updateMainWindowPositionTimeout) { + clearTimeout(updateMainWindowPositionTimeout); + updateMainWindowPosition(); + } +} + +function updateMainWindowPosition() { + if (!mainWindow) { + return; + } + updateMainWindowPositionTimeout = null; + var bounds = mainWindow.getBounds(); + if (!mainWindow.isMaximized() && !mainWindow.isMinimized() && !mainWindow.isFullScreen()) { + mainWindowPosition.x = bounds.x; + mainWindowPosition.y = bounds.y; + mainWindowPosition.width = bounds.width; + mainWindowPosition.height = bounds.height; + } + mainWindowPosition.maximized = mainWindow.isMaximized(); + mainWindowPosition.fullScreen = mainWindow.isFullScreen(); + mainWindowPosition.displayBounds = require('screen').getDisplayMatching(bounds).bounds; + mainWindowPosition.changed = true; +} + +function saveMainWindowPosition() { + if (!mainWindowPosition.changed) { + return; + } + delete mainWindowPosition.changed; + try { + fs.writeFile(windowPositionFileName, JSON.stringify(mainWindowPosition), 'utf8'); + } catch (e) {} +} + +function restoreMainWindowPosition() { + fs.readFile(windowPositionFileName, 'utf8', function(err, data) { + if (data) { + mainWindowPosition = JSON.parse(data); + if (mainWindow) { + if (mainWindowPosition.width && mainWindowPosition.height) { + var displayBounds = require('screen').getDisplayMatching(mainWindowPosition).bounds; + var db = mainWindowPosition.displayBounds; + if (displayBounds.x === db.x && displayBounds.y === db.y && + displayBounds.width === db.width && displayBounds.height === db.height) { + mainWindow.setBounds(mainWindowPosition); + } + } + if (mainWindowPosition.maximized) { mainWindow.maximize(); } + if (mainWindowPosition.fullScreen) { mainWindow.setFullScreen(true); } + } + } + }); +} + function emitBackboneEvent(e) { mainWindow.webContents.executeJavaScript('Backbone.trigger("' + e + '");'); } diff --git a/release-notes.md b/release-notes.md index 45cae65f..12b71806 100644 --- a/release-notes.md +++ b/release-notes.md @@ -5,6 +5,7 @@ Storage providers, usability improvements `+` option to remember keyfiles `+` beta version app `+` option to lock on password copy +`+` save/restore window position after close ##### v1.0.0 (2016-02-12) Performance, stability and quality improvements