From fc642c8d04e948d9ef9fe8650df9b326d1c71805 Mon Sep 17 00:00:00 2001 From: NejcZdovc Date: Sun, 13 Aug 2017 12:56:27 +0200 Subject: [PATCH] Save window appState into windowState when closing a window Resolves #8600 Resolves #9709 Auditors: Test Plan: --- app/browser/windows.js | 3 +++ app/common/state/windowState.js | 19 +++++++++++++++- app/renderer/components/main/main.js | 1 - js/actions/windowActions.js | 10 ++++++++ js/constants/windowConstants.js | 3 ++- js/entry.js | 2 +- js/stores/appStore.js | 34 +++++++++++++++++----------- js/stores/windowStore.js | 3 +++ 8 files changed, 58 insertions(+), 17 deletions(-) diff --git a/app/browser/windows.js b/app/browser/windows.js index b692e228fbc..1d89d903570 100644 --- a/app/browser/windows.js +++ b/app/browser/windows.js @@ -18,6 +18,7 @@ const windowState = require('../common/state/windowState') const Immutable = require('immutable') const pinnedSitesState = require('../common/state/pinnedSitesState') const pinnedSitesUtil = require('../common/lib/pinnedSitesUtil') +const windowActions = require('../../js/actions/windowActions') // TODO(bridiver) - set window uuid let currentWindows = {} @@ -59,6 +60,7 @@ const updateWindow = (windowId) => { const windowValue = getWindowValue(windowId) if (windowValue) { appActions.windowUpdated(windowValue) + windowActions.onWindowUpdate(windowId, windowValue) } } @@ -189,6 +191,7 @@ const api = { LocalShortcuts.register(win) appActions.windowCreated(windowValue) + windowActions.onWindowUpdate(windowId, windowValue) }) win.once('closed', () => { cleanupWindow(windowId) diff --git a/app/common/state/windowState.js b/app/common/state/windowState.js index 8b9505b7c78..39301c6d000 100644 --- a/app/common/state/windowState.js +++ b/app/common/state/windowState.js @@ -109,7 +109,14 @@ const api = { index = parseInt(index) assert.ok(index >= 0, 'index must be positive') state = validateState(state) - return state.set('windows', state.get('windows').delete(index)) + const window = state.getIn(['windows', index]) + + if (window == null) { + return state + } + + state = state.set('windows', state.get('windows').delete(index)) + return state.set('lastClosedWindow', window) }, removeWindow: (state, action) => { @@ -182,6 +189,16 @@ const api = { !windowState.getIn(['ui', 'noScriptInfo', 'isVisible']) && frame && !frame.getIn(['security', 'loginRequiredDetail']) && !windowState.getIn(['ui', 'menubar', 'selectedIndex']) + }, + + getLastClosedWindow: (state, windowId) => { + state = validateState(state) + + if (state.getIn(['lastClosedWindow', 'windowId']) === windowId) { + return state.get('lastClosedWindow') + } + + return null } } diff --git a/app/renderer/components/main/main.js b/app/renderer/components/main/main.js index 3276e4b0649..ca5c1daf4eb 100644 --- a/app/renderer/components/main/main.js +++ b/app/renderer/components/main/main.js @@ -440,7 +440,6 @@ class Main extends React.Component { } }, { passive: true }) - // disable dnd by default window.addEventListener('dragover', function (event) { // allow webviews to handle dnd diff --git a/js/actions/windowActions.js b/js/actions/windowActions.js index 0caad9b0b77..a1887f23fdc 100644 --- a/js/actions/windowActions.js +++ b/js/actions/windowActions.js @@ -1203,6 +1203,16 @@ const windowActions = { bookmarkKey, type }) + }, + + onWindowUpdate: function (windowId, windowValue) { + dispatch({ + actionType: windowConstants.WINDOW_ON_WINDOW_UPDATE, + queryInfo: { + windowId + }, + windowValue + }) } } diff --git a/js/constants/windowConstants.js b/js/constants/windowConstants.js index 40c56fcef02..4b38ce4515a 100644 --- a/js/constants/windowConstants.js +++ b/js/constants/windowConstants.js @@ -108,7 +108,8 @@ const windowConstants = { WINDOW_ON_BOOKMARK_ADDED: _, WINDOW_ON_ADD_BOOKMARK_FOLDER: _, WINDOW_ON_EDIT_BOOKMARK_FOLDER: _, - WINDOW_ON_BOOKMARK_FOLDER_CLOSE: _ + WINDOW_ON_BOOKMARK_FOLDER_CLOSE: _, + WINDOW_ON_WINDOW_UPDATE: _ } module.exports = mapValuesByKeys(windowConstants) diff --git a/js/entry.js b/js/entry.js index 12e060b627b..21504886a68 100644 --- a/js/entry.js +++ b/js/entry.js @@ -74,7 +74,7 @@ ipc.on(messages.CLEAR_CLOSED_FRAMES, () => { windowActions.clearClosedFrames() }) -window.addEventListener('beforeunload', function (e) { +window.addEventListener('beforeunload', function () { ipc.send(messages.LAST_WINDOW_STATE, windowStore.getState().toJS()) }) diff --git a/js/stores/appStore.js b/js/stores/appStore.js index eeefc8a2455..77d28e941a7 100644 --- a/js/stores/appStore.js +++ b/js/stores/appStore.js @@ -78,9 +78,9 @@ const navbarHeight = () => { */ const setWindowDimensions = (browserOpts, defaults, immutableWindowState) => { assert(isImmutable(immutableWindowState)) - if (immutableWindowState.getIn(['ui', 'size'])) { - browserOpts.width = firstDefinedValue(browserOpts.width, immutableWindowState.getIn(['ui', 'size', 0])) - browserOpts.height = firstDefinedValue(browserOpts.height, immutableWindowState.getIn(['ui', 'size', 1])) + if (immutableWindowState.getIn(['appData'])) { + browserOpts.width = firstDefinedValue(browserOpts.width, immutableWindowState.getIn(['appData', 'width'])) + browserOpts.height = firstDefinedValue(browserOpts.height, immutableWindowState.getIn(['appData', 'height'])) } browserOpts.width = firstDefinedValue(browserOpts.width, browserOpts.innerWidth, defaults.width) // height and innerHeight are the frame webview size @@ -103,10 +103,10 @@ const setWindowPosition = (browserOpts, defaults, immutableWindowState) => { const screenPos = electron.screen.getCursorScreenPoint() browserOpts.x = screenPos.x browserOpts.y = screenPos.y - } else if (immutableWindowState.getIn(['ui', 'position'])) { + } else if (immutableWindowState.getIn(['appData'])) { // Position comes from window state - browserOpts.x = firstDefinedValue(browserOpts.x, immutableWindowState.getIn(['ui', 'position', 0])) - browserOpts.y = firstDefinedValue(browserOpts.y, immutableWindowState.getIn(['ui', 'position', 1])) + browserOpts.x = firstDefinedValue(browserOpts.x, immutableWindowState.getIn(['appData', 'left'])) + browserOpts.y = firstDefinedValue(browserOpts.y, immutableWindowState.getIn(['appData', 'top'])) } else if (typeof defaults.x === 'number' && typeof defaults.y === 'number') { // Position comes from the default position browserOpts.x = firstDefinedValue(browserOpts.x, defaults.x) @@ -132,9 +132,17 @@ const createWindow = (action) => { delete browserOpts.top const screen = electron.screen - const primaryDisplay = screen.getPrimaryDisplay() + let primaryDisplay = screen.getPrimaryDisplay() const parentWindowKey = browserOpts.parentWindowKey - const parentWindow = parentWindowKey ? BrowserWindow.fromId(parentWindowKey) : BrowserWindow.getFocusedWindow() + if (browserOpts.x != null && browserOpts.y != null) { + const matchingDisplay = screen.getDisplayMatching(browserOpts) + if (matchingDisplay != null) { + primaryDisplay = matchingDisplay + } + } + const parentWindow = parentWindowKey + ? BrowserWindow.fromId(parentWindowKey) + : BrowserWindow.getFocusedWindow() const bounds = parentWindow ? parentWindow.getBounds() : primaryDisplay.bounds // position on screen should be relative to focused window @@ -198,6 +206,10 @@ const createWindow = (action) => { windowProps.icon = path.join(__dirname, '..', '..', 'res', 'app.png') } + if (immutableWindowState.getIn(['appData', 'state']) === 'fullscreen') { + windowProps.fullscreen = true + } + const homepageSetting = getSetting(settings.HOMEPAGE) const startupSetting = getSetting(settings.STARTUP_MODE) const toolbarUserInterfaceScale = getSetting(settings.TOOLBAR_UI_SCALE) @@ -233,14 +245,10 @@ const createWindow = (action) => { frames = Immutable.fromJS([{}]) } - if (immutableWindowState.getIn(['ui', 'isMaximized'])) { + if (immutableWindowState.getIn(['appData', 'state']) === 'maximized') { mainWindow.maximize() } - if (immutableWindowState.getIn(['ui', 'isFullScreen'])) { - mainWindow.setFullScreen(true) - } - mainWindow.webContents.on('did-finish-load', (e) => { lastEmittedState = appState mainWindow.webContents.setZoomLevel(zoomLevel[toolbarUserInterfaceScale] || 0.0) diff --git a/js/stores/windowStore.js b/js/stores/windowStore.js index 7a9a7773952..979864e22e4 100644 --- a/js/stores/windowStore.js +++ b/js/stores/windowStore.js @@ -798,6 +798,9 @@ const doAction = (action) => { } break } + case windowConstants.WINDOW_ON_WINDOW_UPDATE: + windowState = windowState.setIn(['appData'], action.windowValue) + break default: break }