From c8f62f6d19e5d6035bf3c7cf9b15152dd540a730 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Thu, 20 Jan 2022 23:45:57 +0200 Subject: [PATCH 1/5] fix window position save spam (and also window position being forgotten on maximizing) --- index.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 07801d58..999b7e8a 100644 --- a/index.js +++ b/index.js @@ -142,22 +142,44 @@ function createMainWindow() { win.on("closed", onClosed); win.on("move", () => { + if (win.isMaximized()) return; let position = win.getPosition(); - config.set("window-position", { x: position[0], y: position[1] }); + lateSave("window-position", { x: position[0], y: position[1] }); }); + let winWasMaximized; + win.on("resize", () => { const windowSize = win.getSize(); - config.set("window-maximized", win.isMaximized()); - if (!win.isMaximized()) { - config.set("window-size", { + const isMaximized = win.isMaximized(); + if (winWasMaximized !== isMaximized) { + winWasMaximized = isMaximized; + config.set("window-maximized", isMaximized); + console.log('set window-maximized to ', isMaximized) // DELETE + } + if (!isMaximized) { + lateSave("window-size", { width: windowSize[0], height: windowSize[1], }); } }); + let savedTimeout = { + "window-position": null, + "window-siza": null + } + function lateSave(key, value) { + if (savedTimeout[key]) clearTimeout(savedTimeout[key]); + + savedTimeout[key] = setTimeout(() => { + config.set(key, value); + console.log('saving ', key, value); // DELETE + savedTimeout[key] = null; + }, 1000) + } + win.webContents.on("render-process-gone", (event, webContents, details) => { showUnresponsiveDialog(win, details); }); From a744a2ebde426e1c2ef430d08505b6c8bcfc62f3 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Fri, 21 Jan 2022 00:01:14 +0200 Subject: [PATCH 2/5] fix window position save spam --- index.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 07801d58..51fa1b33 100644 --- a/index.js +++ b/index.js @@ -143,21 +143,37 @@ function createMainWindow() { win.on("move", () => { let position = win.getPosition(); - config.set("window-position", { x: position[0], y: position[1] }); + lateSave("window-position", { x: position[0], y: position[1] }); }); + let winWasMaximized; + win.on("resize", () => { const windowSize = win.getSize(); - config.set("window-maximized", win.isMaximized()); - if (!win.isMaximized()) { - config.set("window-size", { + const isMaximized = win.isMaximized(); + if (winWasMaximized !== isMaximized) { + winWasMaximized = isMaximized; + config.set("window-maximized", isMaximized); + } + if (!isMaximized) { + lateSave("window-size", { width: windowSize[0], height: windowSize[1], }); } }); + let savedTimeouts = {}; + function lateSave(key, value) { + if (savedTimeouts[key]) clearTimeout(savedTimeouts[key]); + + savedTimeouts[key] = setTimeout(() => { + config.set(key, value); + savedTimeouts[key] = undefined; + }, 1000) + } + win.webContents.on("render-process-gone", (event, webContents, details) => { showUnresponsiveDialog(win, details); }); From 28b6d9959933b86e59e9095c967c1b2ec4a524f5 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Fri, 21 Jan 2022 00:05:05 +0200 Subject: [PATCH 3/5] lint --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 6e67fc6d..632839d9 100644 --- a/index.js +++ b/index.js @@ -172,7 +172,6 @@ function createMainWindow() { savedTimeouts[key] = setTimeout(() => { config.set(key, value); savedTimeouts[key] = undefined; - }, 1000) } From 74b67c3d338e80782d940e6b02a19ed00a828817 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Thu, 20 Jan 2022 22:54:19 +0200 Subject: [PATCH 4/5] fix restart app on config change option --- config/index.js | 7 +++++++ config/plugins.js | 11 +++++++++-- index.js | 6 ------ menu.js | 32 ++++++++++++++++---------------- plugins/discord/menu.js | 6 +++--- plugins/downloader/menu.js | 6 +++--- plugins/notifications/utils.js | 4 ++-- plugins/precise-volume/front.js | 4 ++-- plugins/precise-volume/menu.js | 4 ++-- plugins/shortcuts/menu.js | 4 ++-- plugins/video-toggle/menu.js | 4 ++-- providers/app-controls.js | 6 ++++++ 12 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 providers/app-controls.js diff --git a/config/index.js b/config/index.js index c77e4d00..cf33369e 100644 --- a/config/index.js +++ b/config/index.js @@ -1,11 +1,17 @@ const defaultConfig = require("./defaults"); const plugins = require("./plugins"); const store = require("./store"); +const { restart } = require("../providers/app-controls"); const set = (key, value) => { store.set(key, value); }; +function setMenuOption(key, value) { + set(key, value); + if (store.get("options.restartOnConfigChanges")) restart(); +} + const get = (key) => { return store.get(key); }; @@ -14,6 +20,7 @@ module.exports = { defaultConfig, get, set, + setMenuOption, edit: () => store.openInEditor(), watch: (cb) => { store.onDidChange("options", cb); diff --git a/config/plugins.js b/config/plugins.js index 7a73335c..b8c00f83 100644 --- a/config/plugins.js +++ b/config/plugins.js @@ -1,4 +1,5 @@ const store = require("./store"); +const { restart } = require("../providers/app-controls"); function getEnabled() { const plugins = store.get("plugins"); @@ -24,16 +25,21 @@ function setOptions(plugin, options) { }); } +function setMenuOptions(plugin, options) { + setOptions(plugin, options); + if (store.get("options.restartOnConfigChanges")) restart(); +} + function getOptions(plugin) { return store.get("plugins")[plugin]; } function enable(plugin) { - setOptions(plugin, { enabled: true }); + setMenuOptions(plugin, { enabled: true }); } function disable(plugin) { - setOptions(plugin, { enabled: false }); + setMenuOptions(plugin, { enabled: false }); } module.exports = { @@ -42,5 +48,6 @@ module.exports = { enable, disable, setOptions, + setMenuOptions, getOptions, }; diff --git a/index.js b/index.js index 07801d58..f12d6ddc 100644 --- a/index.js +++ b/index.js @@ -307,12 +307,6 @@ app.on("ready", () => { mainWindow = createMainWindow(); setApplicationMenu(mainWindow); - if (config.get("options.restartOnConfigChanges")) { - config.watch(() => { - app.relaunch(); - app.exit(); - }); - } setUpTray(app, mainWindow); // Autostart at login diff --git a/menu.js b/menu.js index 0a62249b..394f05c7 100644 --- a/menu.js +++ b/menu.js @@ -68,7 +68,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.autoUpdates"), click: (item) => { - config.set("options.autoUpdates", item.checked); + config.setMenuOption("options.autoUpdates", item.checked); }, }, { @@ -76,7 +76,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.resumeOnStart"), click: (item) => { - config.set("options.resumeOnStart", item.checked); + config.setMenuOption("options.resumeOnStart", item.checked); }, }, { @@ -84,7 +84,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.removeUpgradeButton"), click: (item) => { - config.set("options.removeUpgradeButton", item.checked); + config.setMenuOption("options.removeUpgradeButton", item.checked); }, }, ...(is.windows() || is.linux() @@ -94,7 +94,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.hideMenu"), click: (item) => { - config.set("options.hideMenu", item.checked); + config.setMenuOption("options.hideMenu", item.checked); if (item.checked && !config.get("options.hideMenuWarned")) { dialog.showMessageBox(win, { type: 'info', title: 'Hide Menu Enabled', @@ -114,7 +114,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.startAtLogin"), click: (item) => { - config.set("options.startAtLogin", item.checked); + config.setMenuOption("options.startAtLogin", item.checked); }, }, ] @@ -127,8 +127,8 @@ const mainMenuTemplate = (win) => { type: "radio", checked: !config.get("options.tray"), click: () => { - config.set("options.tray", false); - config.set("options.appVisible", true); + config.setMenuOption("options.tray", false); + config.setMenuOption("options.appVisible", true); }, }, { @@ -137,8 +137,8 @@ const mainMenuTemplate = (win) => { checked: config.get("options.tray") && config.get("options.appVisible"), click: () => { - config.set("options.tray", true); - config.set("options.appVisible", true); + config.setMenuOption("options.tray", true); + config.setMenuOption("options.appVisible", true); }, }, { @@ -147,8 +147,8 @@ const mainMenuTemplate = (win) => { checked: config.get("options.tray") && !config.get("options.appVisible"), click: () => { - config.set("options.tray", true); - config.set("options.appVisible", false); + config.setMenuOption("options.tray", true); + config.setMenuOption("options.appVisible", false); }, }, { type: "separator" }, @@ -157,7 +157,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.trayClickPlayPause"), click: (item) => { - config.set("options.trayClickPlayPause", item.checked); + config.setMenuOption("options.trayClickPlayPause", item.checked); }, }, ], @@ -179,7 +179,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.disableHardwareAcceleration"), click: (item) => { - config.set("options.disableHardwareAcceleration", item.checked); + config.setMenuOption("options.disableHardwareAcceleration", item.checked); }, }, { @@ -187,7 +187,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.restartOnConfigChanges"), click: (item) => { - config.set("options.restartOnConfigChanges", item.checked); + config.setMenuOption("options.restartOnConfigChanges", item.checked); }, }, { @@ -195,7 +195,7 @@ const mainMenuTemplate = (win) => { type: "checkbox", checked: config.get("options.autoResetAppCache"), click: (item) => { - config.set("options.autoResetAppCache", item.checked); + config.setMenuOption("options.autoResetAppCache", item.checked); }, }, { type: "separator" }, @@ -316,7 +316,7 @@ async function setProxy(item, win) { }, win); if (typeof output === "string") { - config.set("options.proxy", output); + config.setMenuOption("options.proxy", output); item.checked = output !== ""; } else { //user pressed cancel item.checked = !item.checked; //reset checkbox diff --git a/plugins/discord/menu.js b/plugins/discord/menu.js index 49a087d6..5bdf1f59 100644 --- a/plugins/discord/menu.js +++ b/plugins/discord/menu.js @@ -1,4 +1,4 @@ -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); const { edit } = require("../../config"); const { clear, connect, registerRefresh, isConnected } = require("./back"); @@ -26,7 +26,7 @@ module.exports = (win, options, refreshMenu) => { checked: options.activityTimoutEnabled, click: (item) => { options.activityTimoutEnabled = item.checked; - setOptions('discord', options); + setMenuOptions('discord', options); }, }, { @@ -35,7 +35,7 @@ module.exports = (win, options, refreshMenu) => { checked: options.listenAlong, click: (item) => { options.listenAlong = item.checked; - setOptions('discord', options); + setMenuOptions('discord', options); }, }, { diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index 2f2df421..893283c6 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -6,7 +6,7 @@ const is = require("electron-is"); const ytpl = require("ytpl"); const chokidar = require('chokidar'); -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); const { sendError } = require("./back"); const { defaultMenuDownloadLabel, getFolder, presets, setBadge } = require("./utils"); @@ -48,7 +48,7 @@ module.exports = (win, options) => { }); if (result) { options.downloadFolder = result[0]; - setOptions("downloader", options); + setMenuOptions("downloader", options); } // else = user pressed cancel }, }, @@ -59,7 +59,7 @@ module.exports = (win, options) => { type: "radio", click: () => { options.preset = preset; - setOptions("downloader", options); + setMenuOptions("downloader", options); }, checked: options.preset === preset || presets[preset] === undefined, })), diff --git a/plugins/notifications/utils.js b/plugins/notifications/utils.js index 34c73a77..7cb9e61e 100644 --- a/plugins/notifications/utils.js +++ b/plugins/notifications/utils.js @@ -1,4 +1,4 @@ -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); const path = require("path"); const { app } = require("electron"); const fs = require("fs"); @@ -15,7 +15,7 @@ module.exports.icons = { module.exports.setOption = (options, option, value) => { options[option] = value; - setOptions("notifications", options) + setMenuOptions("notifications", options) } module.exports.urgencyLevels = [ diff --git a/plugins/precise-volume/front.js b/plugins/precise-volume/front.js index 33c9e8c1..a21e0234 100644 --- a/plugins/precise-volume/front.js +++ b/plugins/precise-volume/front.js @@ -1,7 +1,7 @@ const { ipcRenderer } = require("electron"); const { globalShortcut } = require('@electron/remote'); -const { setOptions } = require("../../config/plugins"); +const { setOptions, setMenuOptions } = require("../../config/plugins"); function $(selector) { return document.querySelector(selector); } let api; @@ -41,7 +41,7 @@ function firstRun(options) { for (option in newOptions) { options[option] = newOptions[option]; } - setOptions("precise-volume", options); + setMenuOptions("precise-volume", options); }); } diff --git a/plugins/precise-volume/menu.js b/plugins/precise-volume/menu.js index c3d56f8f..74f7b14a 100644 --- a/plugins/precise-volume/menu.js +++ b/plugins/precise-volume/menu.js @@ -1,5 +1,5 @@ const { enabled } = require("./back"); -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); const prompt = require("custom-electron-prompt"); const promptOptions = require("../../providers/prompt-options"); @@ -11,7 +11,7 @@ function changeOptions(changedOptions, options, win) { if (enabled()) { win.webContents.send("setOptions", changedOptions); } else { // Fallback to usual method if disabled - setOptions("precise-volume", options); + setMenuOptions("precise-volume", options); } } diff --git a/plugins/shortcuts/menu.js b/plugins/shortcuts/menu.js index 20f21233..df9db161 100644 --- a/plugins/shortcuts/menu.js +++ b/plugins/shortcuts/menu.js @@ -1,4 +1,4 @@ -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); const prompt = require("custom-electron-prompt"); const promptOptions = require("../../providers/prompt-options"); @@ -20,7 +20,7 @@ function setOption(options, key = null, newValue = null) { options[key] = newValue; } - setOptions("shortcuts", options); + setMenuOptions("shortcuts", options); } // Helper function for keybind prompt diff --git a/plugins/video-toggle/menu.js b/plugins/video-toggle/menu.js index a73407ca..fb539405 100644 --- a/plugins/video-toggle/menu.js +++ b/plugins/video-toggle/menu.js @@ -1,4 +1,4 @@ -const { setOptions } = require("../../config/plugins"); +const { setMenuOptions } = require("../../config/plugins"); module.exports = (win, options) => [ { @@ -7,7 +7,7 @@ module.exports = (win, options) => [ checked: options.forceHide, click: item => { options.forceHide = item.checked; - setOptions("video-toggle", options); + setMenuOptions("video-toggle", options); } } ]; diff --git a/providers/app-controls.js b/providers/app-controls.js new file mode 100644 index 00000000..9faded69 --- /dev/null +++ b/providers/app-controls.js @@ -0,0 +1,6 @@ +const app = require("electron").app || require('@electron/remote').app; + +module.exports.restart = () => { + app.relaunch(); + app.exit(); +}; From 1248f1c8ec96a48402905b40713fcf5735d7821f Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Thu, 27 Jan 2022 09:58:50 +0200 Subject: [PATCH 5/5] add single instance lock option --- index.js | 20 ++++++++++++++++---- menu.js | 29 +++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/index.js b/index.js index 8360f147..c8022891 100644 --- a/index.js +++ b/index.js @@ -26,6 +26,22 @@ unhandled({ process.env.NODE_OPTIONS = ""; const app = electron.app; +// Prevent window being garbage collected +let mainWindow; +autoUpdater.autoDownload = false; + +if(config.get("options.singleInstanceLock")){ + const gotTheLock = app.requestSingleInstanceLock(); + if (!gotTheLock) app.quit(); + + app.on('second-instance', () => { + if (!mainWindow) return; + if (mainWindow.isMinimized()) mainWindow.restore(); + if (!mainWindow.isVisible()) mainWindow.show(); + mainWindow.focus(); + }); +} + app.commandLine.appendSwitch( "js-flags", // WebAssembly flags @@ -54,10 +70,6 @@ require("electron-debug")({ showDevTools: false //disable automatic devTools on new window }); -// Prevent window being garbage collected -let mainWindow; -autoUpdater.autoDownload = false; - let icon = "assets/youtube-music.png"; if (process.platform == "win32") { icon = "assets/generated/icon.ico"; diff --git a/menu.js b/menu.js index 0a62249b..0344a2bb 100644 --- a/menu.js +++ b/menu.js @@ -87,6 +87,19 @@ const mainMenuTemplate = (win) => { config.set("options.removeUpgradeButton", item.checked); }, }, + { + label: "Single instance lock", + type: "checkbox", + checked: config.get("options.singleInstanceLock"), + click: (item) => { + config.set("options.singleInstanceLock", item.checked); + if (item.checked && !app.hasSingleInstanceLock()) { + app.requestSingleInstanceLock(); + } else if (!item.checked && app.hasSingleInstanceLock()) { + app.releaseSingleInstanceLock(); + } + }, + }, ...(is.windows() || is.linux() ? [ { @@ -166,14 +179,14 @@ const mainMenuTemplate = (win) => { { label: "Advanced options", submenu: [ - { - label: "Proxy", - type: "checkbox", - checked: !!config.get("options.proxy"), - click: (item) => { - setProxy(item, win); - }, - }, + { + label: "Proxy", + type: "checkbox", + checked: !!config.get("options.proxy"), + click: (item) => { + setProxy(item, win); + }, + }, { label: "Disable hardware acceleration", type: "checkbox",