/* global __dirname, process */ const { BrowserWindow, Menu, app, shell } = require('electron'); const isDev = require('electron-is-dev'); const { autoUpdater } = require('electron-updater'); const windowStateKeeper = require('electron-window-state'); const { initPopupsConfigurationMain, getPopupTarget, setupAlwaysOnTopMain } = require('jitsi-meet-electron-utils'); const path = require('path'); const URL = require('url'); autoUpdater.logger = require('electron-log'); autoUpdater.logger.transports.file.level = 'info'; /** * Load debug utilities (don't open the DevTools window by default though). */ require('electron-debug')({ showDevTools: false }); /** * The window object that will load the iframe with Jitsi Meet. * IMPORTANT: Must be defined as global in order to not be garbage collected * acidentally. */ let mainWindow = null; /** * Sets the application menu. It is hidden on all platforms except macOS because * otherwise copy and paste functionality is not available. */ function setApplicationMenu() { if (process.platform === 'darwin') { const template = [ { label: app.getName(), submenu: [ { label: 'Quit', accelerator: 'Command+Q', click() { app.quit(); } } ] }, { label: 'Edit', submenu: [ { label: 'Undo', accelerator: 'CmdOrCtrl+Z', selector: 'undo:' }, { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', selector: 'redo:' }, { type: 'separator' }, { label: 'Cut', accelerator: 'CmdOrCtrl+X', selector: 'cut:' }, { label: 'Copy', accelerator: 'CmdOrCtrl+C', selector: 'copy:' }, { label: 'Paste', accelerator: 'CmdOrCtrl+V', selector: 'paste:' }, { label: 'Select All', accelerator: 'CmdOrCtrl+A', selector: 'selectAll:' } ] } ]; Menu.setApplicationMenu(Menu.buildFromTemplate(template)); } else { Menu.setApplicationMenu(null); } } /** * Opens new window with index.html(Jitsi Meet is loaded in iframe there). */ function createJitsiMeetWindow() { // Application menu. setApplicationMenu(); // Check for Updates. autoUpdater.checkForUpdatesAndNotify(); // Load the previous window state with fallback to defaults. const windowState = windowStateKeeper({ defaultWidth: 800, defaultHeight: 600 }); // Path to root directory. const basePath = isDev ? __dirname : app.getAppPath(); // URL for index.html which will be our entry point. const indexURL = URL.format({ pathname: path.resolve(basePath, './build/index.html'), protocol: 'file:', slashes: true }); // Options used when creating the main Jitsi Meet window. const options = { x: windowState.x, y: windowState.y, width: windowState.width, height: windowState.height, icon: path.resolve(basePath, './resources/icons/icon_512x512.png'), minWidth: 800, minHeight: 600, show: false, titleBarStyle: 'hidden', webPreferences: { nativeWindowOpen: true } }; mainWindow = new BrowserWindow(options); windowState.manage(mainWindow); mainWindow.loadURL(indexURL); initPopupsConfigurationMain(mainWindow); setupAlwaysOnTopMain(mainWindow); mainWindow.webContents.on('new-window', (event, url, frameName) => { const target = getPopupTarget(url, frameName); if (!target || target === 'browser') { event.preventDefault(); shell.openExternal(url); } }); mainWindow.on('closed', () => { mainWindow = null; }); mainWindow.once('ready-to-show', () => { mainWindow.show(); }); } /** * Force Single Instance Application. */ const isSecondInstance = app.makeSingleInstance(() => { /** * If someone creates second instance of the application, set focus on * existing window. */ if (mainWindow) { if (mainWindow.isMinimized()) { mainWindow.restore(); } mainWindow.focus(); } }); if (isSecondInstance) { app.quit(); process.exit(0); } /** * Run the application. */ app.on('activate', () => { if (mainWindow === null) { createJitsiMeetWindow(); } }); app.on('certificate-error', // eslint-disable-next-line max-params (event, webContents, url, error, certificate, callback) => { if (url.startsWith('https://localhost')) { event.preventDefault(); callback(true); } else { callback(false); } } ); app.on('ready', createJitsiMeetWindow); app.on('window-all-closed', () => { // Don't quit the application for macOS. if (process.platform !== 'darwin') { app.quit(); } });