2018-03-21 14:29:51 +01:00
|
|
|
import { app, BrowserWindow, dialog, screen } from 'electron';
|
2018-03-08 00:03:45 +01:00
|
|
|
import isDev from 'electron-is-dev';
|
2018-03-21 14:29:51 +01:00
|
|
|
import windowStateKeeper from 'electron-window-state';
|
|
|
|
|
2018-01-18 03:13:08 +01:00
|
|
|
import setupBarMenu from './menu/setupBarMenu';
|
|
|
|
import setupContextMenu from './menu/setupContextMenu';
|
|
|
|
|
2018-02-24 00:20:12 +01:00
|
|
|
export default appState => {
|
2018-03-21 14:29:51 +01:00
|
|
|
// 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,
|
|
|
|
});
|
|
|
|
|
2018-01-18 03:13:08 +01:00
|
|
|
let windowConfiguration = {
|
2018-03-26 23:32:43 +02:00
|
|
|
backgroundColor: '#44b098',
|
|
|
|
minWidth: 950,
|
2018-01-18 03:13:08 +01:00
|
|
|
minHeight: 600,
|
|
|
|
autoHideMenuBar: true,
|
|
|
|
show: false,
|
2018-03-21 14:29:51 +01:00
|
|
|
// 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,
|
2018-01-18 03:13:08 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
// Disable renderer process's webSecurity on development to enable CORS.
|
2018-03-08 00:03:45 +01:00
|
|
|
windowConfiguration = isDev
|
|
|
|
? {
|
|
|
|
...windowConfiguration,
|
|
|
|
webPreferences: {
|
|
|
|
webSecurity: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
: windowConfiguration;
|
2018-01-18 03:13:08 +01:00
|
|
|
|
2018-03-08 00:03:45 +01:00
|
|
|
const rendererURL = isDev
|
|
|
|
? `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`
|
|
|
|
: `file://${__dirname}/index.html`;
|
2018-01-18 03:13:08 +01:00
|
|
|
|
|
|
|
let window = new BrowserWindow(windowConfiguration);
|
|
|
|
|
2018-03-21 14:29:51 +01:00
|
|
|
// 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
|
|
|
|
|
|
|
window.loadURL(rendererURL);
|
|
|
|
|
|
|
|
let deepLinkingURI;
|
2018-03-20 00:03:14 +01:00
|
|
|
if (
|
|
|
|
(process.platform === 'win32' || process.platform === 'linux') &&
|
|
|
|
String(process.argv[1]).startsWith('lbry')
|
|
|
|
) {
|
|
|
|
[, 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-03-20 00:03:14 +01:00
|
|
|
if (process.platform === 'win32') {
|
|
|
|
deepLinkingURI = deepLinkingURI.replace(/\/$/, '').replace('/#', '#');
|
|
|
|
}
|
|
|
|
} else {
|
2018-03-19 21:51:57 +01:00
|
|
|
deepLinkingURI = appState.macDeepLinkingURI;
|
2018-01-18 03:13:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
setupBarMenu();
|
|
|
|
setupContextMenu(window);
|
|
|
|
|
2018-02-24 00:20:12 +01:00
|
|
|
window.on('close', event => {
|
2018-03-17 21:44:46 +01:00
|
|
|
if (!appState.isQuitting && !appState.autoUpdateAccepted) {
|
2018-02-24 00:20:12 +01:00
|
|
|
event.preventDefault();
|
|
|
|
window.hide();
|
|
|
|
}
|
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.send('open-uri-requested', deepLinkingURI, true);
|
|
|
|
window.webContents.session.setUserAgent(`LBRY/${app.getVersion()}`);
|
2018-03-08 00:03:45 +01:00
|
|
|
if (isDev) {
|
2018-01-18 03:13:08 +01:00
|
|
|
window.webContents.openDevTools();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
window.webContents.on('crashed', () => {
|
|
|
|
window = null;
|
|
|
|
});
|
|
|
|
|
|
|
|
return window;
|
|
|
|
};
|