diff options
author | V <vendicated@riseup.net> | 2023-04-04 01:16:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-04 01:16:29 +0200 |
commit | 6b26c12bfa1f28d40834478b50d2f7b09c9f54fb (patch) | |
tree | 48687349f9bf6803ee8993b3eafa3ea1e4f3dff2 /src/main/patcher.ts | |
parent | 5bb08bdb6465eebc9dcf80ba2971d894b804abb8 (diff) | |
download | Vencord-6b26c12bfa1f28d40834478b50d2f7b09c9f54fb.tar.gz Vencord-6b26c12bfa1f28d40834478b50d2f7b09c9f54fb.tar.bz2 Vencord-6b26c12bfa1f28d40834478b50d2f7b09c9f54fb.zip |
Add additional build flavours for Vencord Desktop (#765)
Diffstat (limited to 'src/main/patcher.ts')
-rw-r--r-- | src/main/patcher.ts | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/main/patcher.ts b/src/main/patcher.ts new file mode 100644 index 0000000..c45a299 --- /dev/null +++ b/src/main/patcher.ts @@ -0,0 +1,120 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +import { onceDefined } from "@utils/onceDefined"; +import electron, { app, BrowserWindowConstructorOptions, Menu } from "electron"; +import { dirname, join } from "path"; + +import { getSettings, initIpc } from "./ipcMain"; +import { IS_VANILLA } from "./utils/constants"; + +console.log("[Vencord] Starting up..."); + +// Our injector file at app/index.js +const injectorPath = require.main!.filename; + +// special discord_arch_electron injection method +const asarName = require.main!.path.endsWith("app.asar") ? "_app.asar" : "app.asar"; + +// The original app.asar +const asarPath = join(dirname(injectorPath), "..", asarName); + +const discordPkg = require(join(asarPath, "package.json")); +require.main!.filename = join(asarPath, discordPkg.main); + +// @ts-ignore Untyped method? Dies from cringe +app.setAppPath(asarPath); + +if (!IS_VANILLA) { + const settings = getSettings(); + + // Repatch after host updates on Windows + if (process.platform === "win32") { + require("./patchWin32Updater"); + + if (settings.winCtrlQ) { + const originalBuild = Menu.buildFromTemplate; + Menu.buildFromTemplate = function (template) { + if (template[0]?.label === "&File") { + const { submenu } = template[0]; + if (Array.isArray(submenu)) { + submenu.push({ + label: "Quit (Hidden)", + visible: false, + acceleratorWorksWhenHidden: true, + accelerator: "Control+Q", + click: () => app.quit() + }); + } + } + return originalBuild.call(this, template); + }; + } + } + + class BrowserWindow extends electron.BrowserWindow { + constructor(options: BrowserWindowConstructorOptions) { + if (options?.webPreferences?.preload && options.title) { + const original = options.webPreferences.preload; + options.webPreferences.preload = join(__dirname, "preload.js"); + options.webPreferences.sandbox = false; + if (settings.frameless) { + options.frame = false; + } else if (process.platform === "win32" && settings.winNativeTitleBar) { + delete options.frame; + } + + // This causes electron to freeze / white screen for some people + if ((settings as any).transparentUNSAFE_USE_AT_OWN_RISK) { + options.transparent = true; + options.backgroundColor = "#00000000"; + } + + process.env.DISCORD_PRELOAD = original; + + super(options); + initIpc(this); + } else super(options); + } + } + Object.assign(BrowserWindow, electron.BrowserWindow); + // esbuild may rename our BrowserWindow, which leads to it being excluded + // from getFocusedWindow(), so this is necessary + // https://github.com/discord/electron/blob/13-x-y/lib/browser/api/browser-window.ts#L60-L62 + Object.defineProperty(BrowserWindow, "name", { value: "BrowserWindow", configurable: true }); + + // Replace electrons exports with our custom BrowserWindow + const electronPath = require.resolve("electron"); + delete require.cache[electronPath]!.exports; + require.cache[electronPath]!.exports = { + ...electron, + BrowserWindow + }; + + // Patch appSettings to force enable devtools + onceDefined(global, "appSettings", s => + s.set("DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING", true) + ); + + process.env.DATA_DIR = join(app.getPath("userData"), "..", "Vencord"); +} else { + console.log("[Vencord] Running in vanilla mode. Not loading Vencord"); +} + +console.log("[Vencord] Loading original Discord app.asar"); +require(require.main!.filename); |