summaryrefslogtreecommitdiffhomepage
path: root/app/window-controller.js
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-07-18 15:07:37 +0200
committerAndrej Mihajlov <and@mullvad.net>2018-08-15 17:39:38 +0200
commit71592249b2dd669b6f24f37bfb7b0f4e43b74998 (patch)
treea6097dc7e5d94d06e99c65fdfe160e824395f50c /app/window-controller.js
parente84e87f4ce5a8c242f756566cdc6fb59a45f7bea (diff)
downloadmullvadvpn-71592249b2dd669b6f24f37bfb7b0f4e43b74998.tar.xz
mullvadvpn-71592249b2dd669b6f24f37bfb7b0f4e43b74998.zip
Add workspaces
Diffstat (limited to 'app/window-controller.js')
-rw-r--r--app/window-controller.js160
1 files changed, 0 insertions, 160 deletions
diff --git a/app/window-controller.js b/app/window-controller.js
deleted file mode 100644
index b27d04d621..0000000000
--- a/app/window-controller.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// @flow
-
-import { screen } from 'electron';
-import type { BrowserWindow, Tray, Display } from 'electron';
-
-export default class WindowController {
- _window: BrowserWindow;
- _tray: Tray;
- _isWindowReady = false;
-
- get window(): BrowserWindow {
- return this._window;
- }
-
- constructor(window: BrowserWindow, tray: Tray) {
- this._window = window;
- this._tray = tray;
-
- this._installDisplayMetricsHandler();
- this._installWindowReadyHandlers();
- }
-
- show(whenReady: boolean = true) {
- if (whenReady) {
- this._executeWhenWindowIsReady(() => this._showImmediately());
- } else {
- this._showImmediately();
- }
- }
-
- hide() {
- this._window.hide();
- }
-
- toggle() {
- if (this._window.isVisible()) {
- this.hide();
- } else {
- this.show();
- }
- }
-
- _showImmediately() {
- const window = this._window;
-
- this._updatePosition();
-
- window.show();
- window.focus();
- }
-
- _updatePosition() {
- const { x, y } = this._getWindowPosition();
- this._window.setPosition(x, y, false);
- }
-
- _getTrayPlacement() {
- switch (process.platform) {
- case 'darwin':
- // macOS has menubar always placed at the top
- return 'top';
-
- case 'win32': {
- // taskbar occupies some part of the screen excluded from work area
- const primaryDisplay = screen.getPrimaryDisplay();
- const displaySize = primaryDisplay.size;
- const workArea = primaryDisplay.workArea;
-
- if (workArea.width < displaySize.width) {
- return workArea.x > 0 ? 'left' : 'right';
- } else if (workArea.height < displaySize.height) {
- return workArea.y > 0 ? 'top' : 'bottom';
- } else {
- return 'none';
- }
- }
-
- default:
- return 'none';
- }
- }
-
- _getWindowPosition(): { x: number, y: number } {
- const windowBounds = this._window.getBounds();
- const trayBounds = this._tray.getBounds();
-
- const primaryDisplay = screen.getPrimaryDisplay();
- const workArea = primaryDisplay.workArea;
- const placement = this._getTrayPlacement();
- const maxX = workArea.x + workArea.width - windowBounds.width;
- const maxY = workArea.y + workArea.height - windowBounds.height;
-
- let x = 0,
- y = 0;
- switch (placement) {
- case 'top':
- x = trayBounds.x + (trayBounds.width - windowBounds.width) * 0.5;
- y = workArea.y;
- break;
-
- case 'bottom':
- x = trayBounds.x + (trayBounds.width - windowBounds.width) * 0.5;
- y = workArea.y + workArea.height - windowBounds.height;
- break;
-
- case 'left':
- x = workArea.x;
- y = trayBounds.y + (trayBounds.height - windowBounds.height) * 0.5;
- break;
-
- case 'right':
- x = workArea.width - windowBounds.width;
- y = trayBounds.y + (trayBounds.height - windowBounds.height) * 0.5;
- break;
-
- case 'none':
- x = workArea.x + (workArea.width - windowBounds.width) * 0.5;
- y = workArea.y + (workArea.height - windowBounds.height) * 0.5;
- break;
- }
-
- x = Math.min(Math.max(x, workArea.x), maxX);
- y = Math.min(Math.max(y, workArea.y), maxY);
-
- return {
- x: Math.round(x),
- y: Math.round(y),
- };
- }
-
- // Installs display event handlers to update the window position on any changes in the display or workarea dimensions.
- _installDisplayMetricsHandler() {
- screen.addListener('display-metrics-changed', this._onDisplayMetricsChanged);
- this._window.once('closed', () => {
- screen.removeListener('display-metrics-changed', this._onDisplayMetricsChanged);
- });
- }
-
- _onDisplayMetricsChanged = (_event: any, _display: Display, changedMetrics: Array<string>) => {
- if (changedMetrics.includes('workArea') && this._window.isVisible()) {
- this._updatePosition();
- }
- };
-
- _installWindowReadyHandlers() {
- this._window.once('ready-to-show', () => {
- this._isWindowReady = true;
- });
- }
-
- _executeWhenWindowIsReady(closure: () => any) {
- if (this._isWindowReady) {
- closure();
- } else {
- this._window.once('ready-to-show', () => {
- closure();
- });
- }
- }
-}