From 8ea6d50d9b8a236fa1dbca7724ec6dafdf97642b Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Sun, 30 Apr 2017 20:42:49 +0200 Subject: [PATCH] refactor main win creation into it's own file --- electron/main-window.js | 108 +++++++++++++++ electron/main.js | 293 +++++++++++++++------------------------- 2 files changed, 217 insertions(+), 184 deletions(-) create mode 100644 electron/main-window.js diff --git a/electron/main-window.js b/electron/main-window.js new file mode 100644 index 0000000000..1e32dbcab5 --- /dev/null +++ b/electron/main-window.js @@ -0,0 +1,108 @@ +const electron = require('electron'); +const BrowserWindow = electron.BrowserWindow; +const path = require('path'); +const url = require('url'); +const open = require('open'); +let mainWin; + +function createWindow(params) { + const IS_DEV = params.IS_DEV; + const ICONS_FOLDER = params.ICONS_FOLDER; + const IS_MAC = params.IS_MAC; + const quitApp = params.quitApp; + const app = params.app; + + let frontendDir; + + if (IS_DEV) { + frontendDir = 'app-src'; + } else { + frontendDir = 'app'; + } + + // Create the browser window. + mainWin = new BrowserWindow({ width: 800, height: 600 }); + + // and load the index.html of the app. + mainWin.loadURL(url.format({ + pathname: path.join(__dirname, '../' + frontendDir + '/index.html'), + protocol: 'file:', + slashes: true, + webPreferences: { + scrollBounce: true + }, + icon: ICONS_FOLDER + '/app-icons/icon_256x256.png' + })); + + // Open the DevTools. + //mainWin.webContents.openDevTools(); + + initWinEventListeners(app, IS_MAC); + + if (IS_MAC) { + createMenu(quitApp); + } + + return mainWin; +} + +function initWinEventListeners(app, IS_MAC) { + // open new window links in browser + mainWin.webContents.on('new-window', function (event, url) { + event.preventDefault(); + open(url); + }); + + mainWin.on('close', function (event) { + // handle darwin + if (IS_MAC) { + if (!darwinForceQuit) { + event.preventDefault(); + mainWin.hide(); + } + } else { + if (!app.isQuiting) { + event.preventDefault(); + mainWin.hide(); + } + } + }); + + mainWin.on('minimize', function (event) { + event.preventDefault(); + mainWin.hide(); + }); +} + +function createMenu(quitApp) { + // Create application menu to enable copy & pasting on MacOS + const menuTpl = [{ + label: 'Application', + submenu: [ + { label: 'About Application', selector: 'orderFrontStandardAboutPanel:' }, + { type: 'separator' }, + { + label: 'Quit', click: quitApp + } + ] + }, { + 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:' } + ] + } + ]; + + // we need to set a menu to get copy & paste working for mac os x + electron.Menu.setApplicationMenu(electron.Menu.buildFromTemplate(menuTpl)); +} + +module.exports = { + createWindow, +}; \ No newline at end of file diff --git a/electron/main.js b/electron/main.js index b3e374c7da..2231717791 100644 --- a/electron/main.js +++ b/electron/main.js @@ -3,7 +3,6 @@ const electron = require('electron'); const powerSaveBlocker = require('electron').powerSaveBlocker; const notifier = require('node-notifier'); -const open = require('open'); const fs = require('fs'); const CONFIG = require('./CONFIG'); const ICONS_FOLDER = __dirname + '/assets/icons/'; @@ -13,108 +12,139 @@ const DESKTOP_ENV = process.env.DESKTOP_SESSION; const IS_GNOME = (DESKTOP_ENV === 'gnome'); const IS_DEV = process.env.NODE_ENV === 'DEV'; -const indicator = require('./indicator'); +const indicatorMod = require('./indicator'); +const mainWinMod = require('./main-window'); const idle = require('./idle'); const jira = require('./jira'); const gitLog = require('./git-log'); -powerSaveBlocker.start('prevent-app-suspension'); - -// Module to control application life. const app = electron.app; -// Module to create native browser window. -const BrowserWindow = electron.BrowserWindow; -const path = require('path'); -const url = require('url'); - -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. let mainWin; let lastIdleTime; +let currentIdleStart; let darwinForceQuit = false; -function createWindow() { - let frontendDir; +// keep app active to keep time tracking running +powerSaveBlocker.start('prevent-app-suspension'); - if (IS_DEV) { - frontendDir = 'app-src'; +// make it a single instance by closing other instances +let shouldQuitBecauseAppIsAnotherInstance = app.makeSingleInstance(() => { + if (mainWin) { + if (mainWin.isMinimized()) { + mainWin.restore(); + } + mainWin.focus(); + } +}); +if (shouldQuitBecauseAppIsAnotherInstance) { + quitApp(); +} + +// APP EVENT LISTENERS +// ------------------- +app.on('ready', createMainWin); +app.on('ready', createIndicator); + +app.on('activate', function () { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWin === null) { + createMainWin(); } else { - frontendDir = 'app'; + showApp(); } +}); - // Create the browser window. - mainWin = new BrowserWindow({ width: 800, height: 600 }); - - // and load the index.html of the app. - mainWin.loadURL(url.format({ - pathname: path.join(__dirname, '../' + frontendDir + '/index.html'), - protocol: 'file:', - slashes: true, - webPreferences: { - scrollBounce: true - }, - icon: ICONS_FOLDER + '/app-icons/icon_256x256.png' - })); - - // Open the DevTools. - //mainWin.webContents.openDevTools(); +app.on('ready', () => { + setInterval(trackTimeFn, CONFIG.PING_INTERVAL); +}); +app.on('before-quit', () => { + // handle darwin if (IS_MAC) { - // Create application menu to enable copy & pasting on MacOS - const menuTpl = [{ - label: 'Application', - submenu: [ - { label: 'About Application', selector: 'orderFrontStandardAboutPanel:' }, - { type: 'separator' }, - { - label: 'Quit', click: quitApp - } - ] - }, { - 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:' } - ] - } - ]; - - // we need to set a menu to get copy & paste working for mac os x - electron.Menu.setApplicationMenu(electron.Menu.buildFromTemplate(menuTpl)); + darwinForceQuit = true; } - // open new window links in browser - mainWin.webContents.on('new-window', function (event, url) { - event.preventDefault(); - open(url); - }); + // un-register all shortcuts. + electron.globalShortcut.unregisterAll(); +}); - mainWin.on('close', function (event) { - // handle darwin - if (IS_MAC) { - if (!darwinForceQuit) { - event.preventDefault(); - mainWin.hide(); - } - } else { - if (!app.isQuiting) { - event.preventDefault(); +// FRONTEND EVENTS +// --------------- +electron.ipcMain.on('SHUTDOWN', quitApp); + +electron.ipcMain.on('REGISTER_GLOBAL_SHORTCUT', (ev, shortcutPassed) => { + registerShowAppShortCut(shortcutPassed); +}); + +electron.ipcMain.on('TOGGLE_DEV_TOOLS', () => { + mainWin.webContents.openDevTools(); +}); + +electron.ipcMain.on('JIRA', (ev, request) => { + jira(mainWin, request); +}); + +electron.ipcMain.on('GIT_LOG', (ev, cwd) => { + gitLog(cwd, mainWin); +}); + +electron.ipcMain.on('NOTIFY', (ev, notification) => { + notifier.notify(notification); +}); + +// HELPER FUNCTIONS +// ---------------- +function createIndicator() { + indicatorMod.init({ + app, + mainWin, + showApp, + quitApp, + IS_MAC, + IS_LINUX, + IS_GNOME, + ICONS_FOLDER, + }); +} +function createMainWin() { + mainWin = mainWinMod.createWindow({ + app, + IS_DEV, + ICONS_FOLDER, + IS_MAC, + quitApp, + }); +} + +function registerShowAppShortCut(shortcutPassed) { + if (shortcutPassed) { + // unregister all previous + electron.globalShortcut.unregisterAll(); + + // Register a shortcut listener. + const ret = electron.globalShortcut.register(shortcutPassed, () => { + if (mainWin.isFocused()) { mainWin.hide(); + } else { + showOrFocus(mainWin); } + }); + + if (!ret) { + console.log('key registration failed'); } - }); + } +} - mainWin.on('minimize', function (event) { - event.preventDefault(); - mainWin.hide(); - }); +function showIdleDialog(idleTimeInMs) { + // first show, then send again + mainWin.webContents.send('WAS_IDLE', ({ + idleTimeInMs: idleTimeInMs, + minIdleTimeInMs: CONFIG.MIN_IDLE_TIME + })); } function showApp() { @@ -137,111 +167,6 @@ function showOrFocus(win) { }, 60); } -// Make it a single instance -let shouldQuitBecauseAppIsAnotherInstance = app.makeSingleInstance(() => { - if (mainWin) { - if (mainWin.isMinimized()) { - mainWin.restore(); - } - mainWin.focus(); - } -}); -if (shouldQuitBecauseAppIsAnotherInstance) { - quitApp(); -} - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', createWindow); - -app.on('ready', () => { - indicator.init({ - app, - mainWin, - showApp, - quitApp, - IS_MAC, - IS_LINUX, - IS_GNOME, - ICONS_FOLDER, - }); -}); - -app.on('activate', function () { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (mainWin === null) { - createWindow(); - } else { - showApp(); - } - -}); - -app.on('ready', () => { - setInterval(trackTimeFn, CONFIG.PING_INTERVAL); -}); - -app.on('before-quit', () => { - // handle darwin - if (IS_MAC) { - darwinForceQuit = true; - } - - // Unregister all shortcuts. - electron.globalShortcut.unregisterAll(); -}); - -// listen to events from frontend -electron.ipcMain.on('SHUTDOWN', quitApp); - -electron.ipcMain.on('REGISTER_GLOBAL_SHORTCUT', (ev, shortcutPassed) => { - if (shortcutPassed) { - // unregister all previous - electron.globalShortcut.unregisterAll(); - - // Register a shortcut listener. - const ret = electron.globalShortcut.register(shortcutPassed, () => { - if (mainWin.isFocused()) { - mainWin.hide(); - } else { - showOrFocus(mainWin); - } - }); - - if (!ret) { - console.log('key registration failed'); - } - } -}); - -electron.ipcMain.on('TOGGLE_DEV_TOOLS', () => { - mainWin.webContents.openDevTools(); -}); - -electron.ipcMain.on('JIRA', (ev, request) => { - jira(mainWin, request); -}); - -electron.ipcMain.on('GIT_LOG', (ev, cwd) => { - gitLog(cwd, mainWin); -}); - -electron.ipcMain.on('NOTIFY', (ev, notification) => { - notifier.notify(notification); -}); - -function showIdleDialog(idleTimeInMs) { - // first show, then send again - mainWin.webContents.send('WAS_IDLE', ({ - idleTimeInMs: idleTimeInMs, - minIdleTimeInMs: CONFIG.MIN_IDLE_TIME - })); -} - -let currentIdleStart; - function trackTimeFn() { idle((stdout) => { let idleTime = parseInt(stdout, 10);