From 08fa75acc11d023a37f72f6f0a86d304ef6fdf18 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 5 Dec 2018 14:33:47 +0100 Subject: [PATCH] Merge 'fix/window-bounds' into 'develop' --- src/assets/images/taskbar/win32/display.ico | Bin 0 -> 101249 bytes src/config.js | 7 +++ src/electron/windowUtils.js | 11 +++++ src/index.js | 47 +++++++++++++++++--- 4 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/assets/images/taskbar/win32/display.ico create mode 100644 src/electron/windowUtils.js diff --git a/src/assets/images/taskbar/win32/display.ico b/src/assets/images/taskbar/win32/display.ico new file mode 100644 index 0000000000000000000000000000000000000000..4f4670a8541228140b70e1e01fad503c910f315a GIT binary patch literal 101249 zcmeHQ4S0-K+MYC8%4b7#*$dMX2ABWm`#F-?qgniRRc|UG!Ib zp>@@^w8dIARJ9cvGm18%m8w?##Kwo9ej*YPlE{3|{brt+ylXNunaoTk@AF*Oo%8;j zbDrn9?{m(~`_4NPlPSb>lL;1LiZnH&&8KKvsq*~}4MI#a=vZ{Leg7eoY1wZ=OkKN{ z@Bj05lWFH*Y8h$YZ(=e%_ty|p6DrYPd_9xtzvqOQ<_#XyuW`ec4XNwK{bTwJ#aW;M zoi|-diaTdA-FUEnp9hD%aPVB#!1&hFT7Pq4)aKXQ&Yj%rmZ$|2Rvo$R?V&wZwqMY|4V-D1hIdrjqPXC-sS)a|_k`?>@$y zs+qf*4eHxfYtccaK3cHEwq)qSdo4|7{JDKmrw=1qoM`vvZ_b2;E%>PEYo-$&)O`)( z%tMpSt0p%6bz{n=MM?X*#>{E;R`;G)|L@fXkC>+1Vr_k6*AbJ)ow@VZCB55pNl4rM zaqsxF?iJlXH$HaL9eLwttp1bt$3{-cN*Qt> zJ*~r2i5c_ej?4VEA}MoG$iDavXHr}2_~R4z?aAK7Cn%S4syP2Apy>@WyzA0T^ zS$r^V+~1o*!+s&(O-lhC{$hUTo*!p+{&D8dGbeHFg-1sW>=n_iB=-3J0jZN3zcjV~nQ2jL zetGZOXd3-p;^~pw7ms;s@7d6($N#gvT5)2*zqVg_IlW!G)JaXRZtNN{W9rD17nZhu zJ&v7peCO?1|NNw5;j9bG2E29WU;Dk0`|2~((@gm>*+rR8y!pp(uXdj}Q<;n6&DpUP ze*gE$h{(gYJ-hz)FHgR|W9$B&5myeS+j{5T*DH7TO>Z8$JNK@~I<8zWw%Obdmzplo z#8{XVdcNbd>-Tys4s<&C+cDs_6?N zI)1P_?bNNOr$>Ako6<3R#EZr8|6atJEVP8>t;k<8wD<2f6qTgEWb1RO_<`yFXqo$L z|Ll^E&o3L2Tl#VK@r_WEj4G2$}PE@ zCv(1~(Z)4dO`jY1%Nk3@|5$%NVsByTuTxSFpXoSljzhd%*Ccm4I_>bbOXq%0A2D@& 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 literal 0 HcmV?d00001 diff --git a/src/config.js b/src/config.js index ba3af14b9..d981f9c6a 100644 --- a/src/config.js +++ b/src/config.js @@ -39,6 +39,13 @@ export const DEFAULT_FEATURES_CONFIG = { isServiceProxyPremiumFeature: true, }; +export const DEFAULT_WINDOW_OPTIONS = { + width: 800, + height: 600, + x: 0, + y: 0, +}; + export const FRANZ_SERVICE_REQUEST = 'https://bit.ly/franz-plugin-docs'; export const FRANZ_TRANSLATION = 'https://bit.ly/franz-translate'; diff --git a/src/electron/windowUtils.js b/src/electron/windowUtils.js new file mode 100644 index 000000000..23b946ac4 --- /dev/null +++ b/src/electron/windowUtils.js @@ -0,0 +1,11 @@ +/* eslint import/prefer-default-export: 0 */ + +import { screen } from 'electron'; + +export function isPositionValid(position) { + const displays = screen.getAllDisplays(); + const { x, y } = position; + return displays.some(({ + workArea, + }) => x >= workArea.x && x <= workArea.x + workArea.width && y >= workArea.y && y <= workArea.y + workArea.height); +} diff --git a/src/index.js b/src/index.js index 37c553840..7f3fe5b44 100644 --- a/src/index.js +++ b/src/index.js @@ -15,10 +15,14 @@ import ipcApi from './electron/ipc-api'; import Tray from './lib/Tray'; import Settings from './electron/Settings'; import handleDeepLink from './electron/deepLinking'; +import { isPositionValid } from './electron/windowUtils'; import { appId } from './package.json'; // eslint-disable-line import/no-unresolved import './electron/exception'; -import { DEFAULT_APP_SETTINGS } from './config'; +import { + DEFAULT_APP_SETTINGS, + DEFAULT_WINDOW_OPTIONS, +} from './config'; /* eslint-enable import/first */ const debug = require('debug')('Franz:App'); @@ -52,6 +56,15 @@ const isSecondInstance = app.makeSingleInstance((argv) => { } } } + + if (argv.includes('--reset-window')) { + // Needs to be delayed to not interfere with mainWindow.restore(); + setTimeout(() => { + debug('Resetting windows via Task'); + mainWindow.setPosition(DEFAULT_WINDOW_OPTIONS.x + 100, DEFAULT_WINDOW_OPTIONS.y + 100); + mainWindow.setSize(DEFAULT_WINDOW_OPTIONS.width, DEFAULT_WINDOW_OPTIONS.height); + }, 1); + } }); if (isSecondInstance) { @@ -78,14 +91,23 @@ if (!settings.get('enableGPUAcceleration')) { const createWindow = () => { // Remember window size const mainWindowState = windowStateKeeper({ - defaultWidth: 800, - defaultHeight: 600, + defaultWidth: DEFAULT_WINDOW_OPTIONS.width, + defaultHeight: DEFAULT_WINDOW_OPTIONS.height, }); + let posX = mainWindowState.x || DEFAULT_WINDOW_OPTIONS.x; + let posY = mainWindowState.y || DEFAULT_WINDOW_OPTIONS.y; + + if (!isPositionValid({ x: posX, y: posY })) { + debug('Window is out of screen bounds, resetting window'); + posX = DEFAULT_WINDOW_OPTIONS.x; + posY = DEFAULT_WINDOW_OPTIONS.y; + } + // Create the browser window. mainWindow = new BrowserWindow({ - x: mainWindowState.x, - y: mainWindowState.y, + x: posX, + y: posY, width: mainWindowState.width, height: mainWindowState.height, minWidth: 600, @@ -187,7 +209,20 @@ const createWindow = () => { // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. -app.on('ready', createWindow); +app.on('ready', () => { + if (process.platform === 'win32') { + app.setUserTasks([{ + program: process.execPath, + arguments: `${isDevMode ? `${__dirname} ` : ''}--reset-window`, + iconPath: path.join(`${__dirname}`, '../src/assets/images/taskbar/win32/display.ico'), + iconIndex: 0, + title: 'Move Franz to Current Display', + description: 'Restore the position and size of Franz', + }]); + } + + createWindow(); +}); // This is the worst possible implementation as the webview.webContents based callback doesn't work 🖕 app.on('login', (event, webContents, request, authInfo, callback) => {