1
0
mirror of https://github.com/jiahaog/Nativefier synced 2024-06-25 07:37:41 +02:00
Nativefier/app/src/components/mainWindow/mainWindow.js

134 lines
4.0 KiB
JavaScript
Raw Normal View History

2016-01-29 15:04:41 +01:00
import path from 'path';
import electron from 'electron';
import windowStateKeeper from 'electron-window-state';
import helpers from './../../helpers/helpers';
import createMenu from './../menu/menu';
import initContextMenu from './../contextMenu/contextMenu';
2016-01-29 15:04:41 +01:00
const {BrowserWindow, shell, ipcMain} = electron;
const {isOSX, linkIsInternal} = helpers;
const ZOOM_INTERVAL = 0.1;
/**
*
* @param {{}} options AppArgs from nativefier.json
* @param {function} onAppQuit
* @param {function} setDockBadge
* @returns {electron.BrowserWindow}
*/
function createMainWindow(options, onAppQuit, setDockBadge) {
2016-01-29 15:04:41 +01:00
const mainWindowState = windowStateKeeper({
defaultWidth: options.width || 1280,
defaultHeight: options.height || 800
});
2016-01-29 15:04:41 +01:00
const mainWindow = new BrowserWindow({
width: mainWindowState.width,
height: mainWindowState.height,
x: mainWindowState.x,
y: mainWindowState.y,
'auto-hide-menu-bar': !options.showMenuBar,
// Convert dashes to spaces because on linux the app name is joined with dashes
title: options.name.replace(/-/g, ' '),
'web-preferences': {
javascript: true,
plugins: true,
// node globals causes problems with sites like messenger.com
nodeIntegration: false,
preload: path.join(__dirname, 'static', 'preload.js')
},
// after webpack path here should reference `resources/app/`
icon: path.join(__dirname, '../', '/icon.png')
});
let currentZoom = 1;
2016-01-29 15:04:41 +01:00
const onZoomIn = () => {
currentZoom += ZOOM_INTERVAL;
mainWindow.webContents.send('change-zoom', currentZoom);
};
2016-01-29 15:04:41 +01:00
const onZoomOut = () => {
currentZoom -= ZOOM_INTERVAL;
mainWindow.webContents.send('change-zoom', currentZoom);
};
createMenu(options.nativefierVersion, onAppQuit, mainWindow.webContents.goBack, mainWindow.webContents.goForward, onZoomIn, onZoomOut, mainWindow.webContents.getURL);
initContextMenu(mainWindow);
if (options.userAgent) {
mainWindow.webContents.setUserAgent(options.userAgent);
}
2016-01-29 15:04:41 +01:00
mainWindow.webContents.on('did-finish-load', () => {
mainWindow.webContents.send('params', JSON.stringify(options));
});
if (options.counter) {
2016-01-29 15:04:41 +01:00
mainWindow.on('page-title-updated', () => {
if (mainWindow.isFocused()) {
return;
}
if (options.counter) {
2016-01-29 15:04:41 +01:00
const itemCountRegex = /[\(](\d*?)[\)]/;
const match = itemCountRegex.exec(mainWindow.getTitle());
if (match) {
setDockBadge(match[1]);
}
return;
}
setDockBadge('●');
});
}
2016-01-29 15:04:41 +01:00
mainWindow.webContents.on('new-window', (event, urlToGo) => {
if (mainWindow.useDefaultWindowBehaviour) {
mainWindow.useDefaultWindowBehaviour = false;
return;
}
if (linkIsInternal(options.targetUrl, urlToGo)) {
return;
}
event.preventDefault();
shell.openExternal(urlToGo);
});
mainWindow.loadURL(options.targetUrl);
2016-01-29 15:04:41 +01:00
mainWindow.on('focus', () => {
setDockBadge('');
});
mainWindow.on('close', event => {
if (mainWindow.isFullScreen()) {
mainWindow.setFullScreen(false);
mainWindow.once('leave-full-screen', maybeHideWindow.bind(this, mainWindow, event));
}
2016-01-23 19:02:23 +01:00
maybeHideWindow(mainWindow, event);
});
mainWindowState.manage(mainWindow);
return mainWindow;
}
ipcMain.on('cancelNewWindowOverride', () => {
const allWindows = BrowserWindow.getAllWindows();
allWindows.forEach(window => {
window.useDefaultWindowBehaviour = false;
});
});
function maybeHideWindow(window, event) {
if (isOSX()) {
// this is called when exiting from clicking the cross button on the window
event.preventDefault();
window.hide();
}
// will close the window on other platforms
}
2016-01-29 15:04:41 +01:00
export default createMainWindow;