From 2bc4393488f6da4355b1745303ca1e5a9494b505 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sun, 23 Jun 2019 16:01:45 -0400 Subject: [PATCH] fix multi-instance launch bug #100 --- main-electron.js | 279 +++++++++++++++++++++++++---------------------- 1 file changed, 147 insertions(+), 132 deletions(-) diff --git a/main-electron.js b/main-electron.js index 32f628da..7398cae6 100644 --- a/main-electron.js +++ b/main-electron.js @@ -9,166 +9,181 @@ const fs = require("fs"); let win; function createWindow() { - // Create the browser window. - win = new BrowserWindow({ - width: 377, - height: 800, - title: "Sengi", - backgroundColor: "#FFF", - useContentSize: true - }); + // Create the browser window. + win = new BrowserWindow({ + width: 377, + height: 800, + title: "Sengi", + backgroundColor: "#FFF", + useContentSize: true + }); - var server = http.createServer(requestHandler).listen(9527); - win.loadURL("http://localhost:9527"); + var server = http.createServer(requestHandler).listen(9527); + win.loadURL("http://localhost:9527"); - const template = [ - { - label: "View", - submenu: [ - { role: "reload" }, - { role: "forcereload" }, - { type: "separator" }, - { role: "close" }, - { role: 'quit' } - ] - }, - { - role: "help", - submenu: [ - { role: "toggledevtools" }, + const template = [ { - label: "Open GitHub project", - click() { - require("electron").shell.openExternal( - "https://github.com/NicolasConstant/sengi" - ); - } + label: "View", + submenu: [ + { role: "reload" }, + { role: "forcereload" }, + { type: "separator" }, + { role: "close" }, + { role: 'quit' } + ] + }, + { + role: "help", + submenu: [ + { role: "toggledevtools" }, + { + label: "Open GitHub project", + click() { + require("electron").shell.openExternal( + "https://github.com/NicolasConstant/sengi" + ); + } + } + ] } - ] + ]; + + const menu = Menu.buildFromTemplate(template); + win.setMenu(menu); + + // Check if we are on a MAC + if (process.platform === "darwin") { + // Create our menu entries so that we can use MAC shortcuts + Menu.setApplicationMenu( + Menu.buildFromTemplate([ + { + label: "Edit", + submenu: [ + { role: "undo" }, + { role: "redo" }, + { type: "separator" }, + { role: "cut" }, + { role: "copy" }, + { role: "paste" }, + { role: "pasteandmatchstyle" }, + { role: "delete" }, + { role: "selectall" }, + { type: "separator" }, + { role: "close" }, + { role: 'quit' } + ] + }, + { + label: "View", + submenu: [{ role: "reload" }, { role: "forcereload" }] + }, + { + role: "help", + submenu: [ + { role: "toggledevtools" }, + { + label: "Open GitHub project", + click() { + require("electron").shell.openExternal( + "https://github.com/NicolasConstant/sengi" + ); + } + } + ] + } + ]) + ); } - ]; - const menu = Menu.buildFromTemplate(template); - win.setMenu(menu); + // Open the DevTools. + // win.webContents.openDevTools() - // Check if we are on a MAC - if (process.platform === "darwin") { - // Create our menu entries so that we can use MAC shortcuts - Menu.setApplicationMenu( - Menu.buildFromTemplate([ - { - label: "Edit", - submenu: [ - { role: "undo" }, - { role: "redo" }, - { type: "separator" }, - { role: "cut" }, - { role: "copy" }, - { role: "paste" }, - { role: "pasteandmatchstyle" }, - { role: "delete" }, - { role: "selectall" }, - { type: "separator" }, - { role: "close" }, - { role: 'quit' } - ] - }, - { - label: "View", - submenu: [{ role: "reload" }, { role: "forcereload" }] - }, - { - role: "help", - submenu: [ - { role: "toggledevtools" }, - { - label: "Open GitHub project", - click() { - require("electron").shell.openExternal( - "https://github.com/NicolasConstant/sengi" - ); - } - } - ] - } - ]) - ); - } + //open external links to browser + win.webContents.on("new-window", function (event, url) { + event.preventDefault(); + shell.openExternal(url); + }); - // Open the DevTools. - // win.webContents.openDevTools() - - //open external links to browser - win.webContents.on("new-window", function(event, url) { - event.preventDefault(); - shell.openExternal(url); - }); - - // Emitted when the window is closed. - win.on("closed", () => { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - win = null; - }); + // Emitted when the window is closed. + win.on("closed", () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null; + }); } function requestHandler(req, res) { - var file = req.url == "/" ? "/index.html" : req.url, - root = __dirname + "/dist", - page404 = root + "/404.html"; + var file = req.url == "/" ? "/index.html" : req.url, + root = __dirname + "/dist", + page404 = root + "/404.html"; - if (file.includes("register") || file.includes("home")) file = "/index.html"; + if (file.includes("register") || file.includes("home")) file = "/index.html"; - getFile(root + file, res, page404); + getFile(root + file, res, page404); } function getFile(filePath, res, page404) { - console.warn(`filePath: ${filePath}`); - fs.exists(filePath, function(exists) { - if (exists) { - fs.readFile(filePath, function(err, contents) { - if (!err) { - res.end(contents); + console.warn(`filePath: ${filePath}`); + fs.exists(filePath, function (exists) { + if (exists) { + fs.readFile(filePath, function (err, contents) { + if (!err) { + res.end(contents); + } else { + console.dir(err); + } + }); } else { - console.dir(err); + fs.readFile(page404, function (err, contents) { + if (!err) { + res.writeHead(404, { "Content-Type": "text/html" }); + res.end(contents); + } else { + console.dir(err); + } + }); } - }); - } else { - fs.readFile(page404, function(err, contents) { - if (!err) { - res.writeHead(404, { "Content-Type": "text/html" }); - res.end(contents); - } else { - console.dir(err); - } - }); - } - }); + }); } app.commandLine.appendSwitch("force-color-profile", "srgb"); -// 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); + +const gotTheLock = app.requestSingleInstanceLock(); + +if (!gotTheLock) { + app.quit(); +} else { + app.on('second-instance', (event, commandLine, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (win) { + if (win.isMinimized()) win.restore() + win.focus() + } + }); + + // 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); +} // Quit when all windows are closed. app.on("window-all-closed", () => { - // On macOS it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== "darwin") { - app.quit(); - } + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== "darwin") { + app.quit(); + } }); app.on("activate", () => { - // On macOS 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 (win === null) { - createWindow(); - } + // On macOS 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 (win === null) { + createWindow(); + } }); // In this file you can include the rest of your app's specific main process