lbry-desktop/src/platforms/electron/createWindow.js

160 lines
4.8 KiB
JavaScript
Raw Normal View History

2019-03-05 05:46:57 +01:00
import path from 'path';
import { app, BrowserWindow, dialog, shell, screen } from 'electron';
import isDev from 'electron-is-dev';
import windowStateKeeper from 'electron-window-state';
2018-01-18 03:13:08 +01:00
import setupBarMenu from './menu/setupBarMenu';
2019-05-01 16:18:26 +02:00
import * as PAGES from '../../ui/constants/pages';
2018-01-18 03:13:08 +01:00
2018-02-24 00:20:12 +01:00
export default appState => {
// Get primary display dimensions from Electron.
const { width, height } = screen.getPrimaryDisplay().workAreaSize;
// Load the previous state with fallback to defaults.
const windowState = windowStateKeeper({
defaultWidth: width,
defaultHeight: height,
});
const windowConfiguration = {
backgroundColor: '#2f9176',
2018-03-26 23:32:43 +02:00
minWidth: 950,
2018-01-18 03:13:08 +01:00
minHeight: 600,
autoHideMenuBar: true,
show: false,
// Create the window using the state information.
x: windowState.x,
y: windowState.y,
// If state is undefined, create window as maximized.
width: windowState.width === undefined ? width : windowState.width,
height: windowState.height === undefined ? height : windowState.height,
icon: 'static/img/tray/default/tray.png',
webPreferences: {
// Disable renderer process's webSecurity on development to enable CORS.
webSecurity: !isDev,
plugins: true,
},
};
2019-05-01 16:18:26 +02:00
const lbryProto = 'lbry://';
const lbryProtoQ = 'lbry://?';
2019-03-28 17:53:13 +01:00
const rendererURL = isDev ? `http://localhost:8080` : `file://${__dirname}/index.html`;
2018-01-18 03:13:08 +01:00
let window = new BrowserWindow(windowConfiguration);
// Let us register listeners on the window, so we can update the state
// automatically (the listeners will be removed when the window is closed)
// and restore the maximized or full screen state.
windowState.manage(window);
2018-01-18 03:13:08 +01:00
let deepLinkingURI;
2019-05-01 16:18:26 +02:00
if (
(process.platform === 'win32' || process.platform === 'linux') &&
String(process.argv[1]).startsWith('lbry')
) {
2019-05-01 16:18:26 +02:00
[, deepLinkingURI] = process.argv || '';
2018-01-18 03:13:08 +01:00
// Keep only command line / deep linked arguments
// Windows normalizes URIs when they're passed in from other apps. On Windows, this tries to
// restore the original URI that was typed.
// - If the URI has no path, Windows adds a trailing slash. LBRY URIs can't have a slash with no
// path, so we just strip it off.
// - In a URI with a claim ID, like lbry://channel#claimid, Windows interprets the hash mark as
// an anchor and converts it to lbry://channel/#claimid. We remove the slash here as well.
2018-06-05 17:22:15 +02:00
// - ? also interpreted as an anchor, remove slash also.
if (process.platform === 'win32') {
2018-06-05 17:22:15 +02:00
deepLinkingURI = deepLinkingURI
.replace(/\/$/, '')
.replace('/#', '#')
.replace('/?', '?');
}
} else {
2019-05-01 16:18:26 +02:00
deepLinkingURI = appState.macDeepLinkingURI || '';
}
// is it a lbry://? pointing to an app page
if (deepLinkingURI.includes(lbryProtoQ)) {
if (Object.values(PAGES).includes(deepLinkingURI.substr(lbryProtoQ.length))) {
deepLinkingURI = deepLinkingURI.replace(lbryProtoQ, '#/$/');
} else {
deepLinkingURI = '';
}
// else is it a claim
} else if (deepLinkingURI.includes(lbryProto)) {
deepLinkingURI = deepLinkingURI.replace(lbryProto, '#');
} else {
deepLinkingURI = '';
2018-01-18 03:13:08 +01:00
}
2019-05-01 16:18:26 +02:00
window.loadURL(rendererURL + deepLinkingURI);
2018-01-18 03:13:08 +01:00
setupBarMenu();
// Windows back/forward mouse navigation
window.on('app-command', (e, cmd) => {
switch (cmd) {
case 'browser-backward':
window.webContents.send('navigate-backward', null);
break;
case 'browser-forward':
window.webContents.send('navigate-forward', null);
break;
default: // Do nothing
}
});
2018-02-24 00:20:12 +01:00
window.on('close', event => {
if (!appState.isQuitting && !appState.autoUpdateAccepted) {
2018-02-24 00:20:12 +01:00
event.preventDefault();
if (window.isFullScreen()) {
window.once('leave-full-screen', () => {
window.hide();
});
window.setFullScreen(false);
} else {
window.hide();
}
2018-02-24 00:20:12 +01:00
}
2018-01-18 03:13:08 +01:00
});
window.on('focus', () => {
window.webContents.send('window-is-focused', null);
});
window.on('unresponsive', () => {
dialog.showMessageBox(
window,
{
type: 'warning',
buttons: ['Wait', 'Quit'],
title: 'LBRY Unresponsive',
defaultId: 1,
message: 'LBRY is not responding. Would you like to quit?',
cancelId: 0,
},
buttonIndex => {
if (buttonIndex === 1) app.quit();
}
);
});
window.once('ready-to-show', () => {
window.show();
});
window.webContents.on('did-finish-load', () => {
window.webContents.session.setUserAgent(`LBRY/${app.getVersion()}`);
if (isDev) {
2018-01-18 03:13:08 +01:00
window.webContents.openDevTools();
}
});
window.webContents.on('crashed', () => {
window = null;
});
window.webContents.on('new-window', (event, url) => {
event.preventDefault();
shell.openExternal(url);
});
2018-01-18 03:13:08 +01:00
return window;
};