diff --git a/package.json b/package.json index 6607f51c..724cdacc 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede", + "arrpc": "https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5b8bf0d..001bb860 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede - version: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede + specifier: https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1446,8 +1446,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86} version: 3.5.0 hasBin: true @@ -2298,6 +2298,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + koffi@2.12.0: + resolution: {integrity: sha512-J886y/bvoGG4ZhMVstB2Nh6/q9tzAYn0kaH7Ss8DWavGIxP5jOLzUY9IZzw9pMuXArj0SLSpl0MYsKRURPAv7g==} + lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} @@ -4466,8 +4469,9 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: dependencies: + koffi: 2.12.0 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -5533,6 +5537,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + koffi@2.12.0: {} + lazy-val@1.0.5: {} lazystream@1.0.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 227d42bd..c4e89fc0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,4 @@ onlyBuiltDependencies: - '@parcel/watcher' - '@vencord/venmic' - electron - - esbuild + - esbuild \ No newline at end of file diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 75ab3b76..7c78b91b 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -62,4 +62,17 @@ export interface LegcordWindow { edit: (id: string) => void; folder: (id: string) => void; }; + rpc: { + listen: ( + callback: (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => void, + ) => void; + getProcessList: () => void; + refreshProcessList: () => void; + }; } diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index 298a7781..0ca35532 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -15,6 +15,7 @@ import { isPowerSavingEnabled, setPowerSaving } from "../power.js"; import constPaths from "../shared/consts/paths.js"; import { splashWindow } from "../splash/main.js"; import { refreshGlobalKeybinds } from "./globalKeybinds.js"; +import { processList, refreshProcessList } from "./rpcProcess.js"; import { importGuilds, mainTouchBar, setVoiceState, voiceTouchBar } from "./touchbar.js"; const userDataPath = app.getPath("userData"); @@ -289,4 +290,10 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("getConstPaths", (event) => { event.returnValue = constPaths; }); + ipcMain.on("getProcessList", (event) => { + event.returnValue = processList; + }); + ipcMain.on("refreshProcessList", () => { + refreshProcessList(); + }); } diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 1314abbb..3ecbcc42 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -4,6 +4,7 @@ import type { LegcordWindow } from "../../@types/legcordWindow.d.ts"; import type { Settings } from "../../@types/settings.js"; import type { ThemeManifest } from "../../@types/themeManifest.js"; import type { venmicListObject } from "../venmic.js"; +let windowCallback: (arg0: object) => void; interface IPCSources { id: string; @@ -88,14 +89,15 @@ contextBridge.exposeInMainWorld("legcord", { folder: (id: string) => ipcRenderer.send("openThemeFolder", id), openQuickCss: () => ipcRenderer.send("openQuickCss"), }, + rpc: { + listen: (callback: () => void) => { + windowCallback = callback; + }, + refreshProcessList: () => ipcRenderer.send("refreshProcessList"), + getProcessList: () => ipcRenderer.sendSync("getProcessList"), + }, } as unknown as LegcordWindow); -let windowCallback: (arg0: object) => void; -contextBridge.exposeInMainWorld("LegcordRPC", { - listen: (callback: () => void) => { - windowCallback = callback; - }, -}); ipcRenderer.on("rpc", (_event, data: object) => { console.log(data); windowCallback(data); diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 59b14332..a68c1a78 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -2,25 +2,30 @@ const { ipcRenderer } = require("electron"); import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; -document.addEventListener("DOMContentLoaded", () => { - document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); - addStyle("legcord://assets/css/baseTitlebar.css"); - sleep(500); - switch (ipcRenderer.sendSync("getOS")) { - case "darwin": - // breaks traffic lights with bar__ and hidden__ classes - // document.body.setAttribute("class", "platform-osx"); - addStyle("legcord://assets/css/darwinTitlebar.css"); - break; - case "win32": - document.body.setAttribute("class", "platform-win"); - addStyle("legcord://assets/css/winTitlebar.css"); - break; - case "linux": - document.body.setAttribute("class", "platform-linux"); - addStyle("legcord://assets/css/linuxTitlebar.css"); - break; - default: - break; - } -}); +if ( + ipcRenderer.sendSync("getConfig", "windowStyle") === "default" || + ipcRenderer.sendSync("getConfig", "windowStyle") === "overlay" +) { + document.addEventListener("DOMContentLoaded", () => { + document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); + addStyle("legcord://assets/css/baseTitlebar.css"); + sleep(500); + switch (ipcRenderer.sendSync("getOS")) { + case "darwin": + // breaks traffic lights with bar__ and hidden__ classes + // document.body.setAttribute("class", "platform-osx"); + addStyle("legcord://assets/css/darwinTitlebar.css"); + break; + case "win32": + document.body.setAttribute("class", "platform-win"); + addStyle("legcord://assets/css/winTitlebar.css"); + break; + case "linux": + document.body.setAttribute("class", "platform-linux"); + addStyle("legcord://assets/css/linuxTitlebar.css"); + break; + default: + break; + } + }); +} diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index cc4525f9..b925c6e0 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -14,16 +14,5 @@ window.localStorage.setItem("hideNag", "true"); declare global { interface Window { legcord: LegcordWindow; - LegcordRPC: { - listen: ( - callback: (msg: { - activity: { - assets: { large_image: string | null; small_image: string | null }; - application_id: number; - name: string; - }; - }) => void, - ) => void; - }; } } diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts new file mode 100644 index 00000000..575a5096 --- /dev/null +++ b/src/discord/rpcProcess.ts @@ -0,0 +1,42 @@ +import path from "node:path"; +import { type BrowserWindow, utilityProcess } from "electron"; +import { getDetectables } from "../common/detectables.js"; +import { createInviteWindow } from "./window.js"; + +let child: Electron.UtilityProcess; +export let processList = []; + +export function startRPC(window: BrowserWindow) { + child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { + env: { detectables: JSON.stringify(getDetectables()) }, + }); + + child.on("spawn", () => { + console.log("[arRPC] process started"); + console.log(child.pid); + }); + + child.on("message", (message) => { + const json = JSON.parse(message); + if (json.type === "invite") { + createInviteWindow(json.code); + } else if (json.type === "activity") { + console.log("activity pulse"); + console.log(json.data); + window.webContents.send("rpc", json.data); + } else if (json.type === "processList") { + console.log("[arRPC] updating process list"); + console.log(json.data); + processList = json.data; + } + }); + + child.on("exit", () => { + console.log("[arRPC] process exited"); + console.log(child.pid); + }); +} + +export function refreshProcessList() { + child.postMessage({ message: "refreshProcessList" }); +} diff --git a/src/discord/window.ts b/src/discord/window.ts index 3bc85959..b755a4ca 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -9,11 +9,9 @@ import { dialog, nativeImage, shell, - utilityProcess, } from "electron"; import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; -import { getDetectables } from "../common/detectables.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; import { initQuickCss, injectThemesMain } from "../common/themes.js"; import { getWindowState, setWindowState } from "../common/windowState.js"; @@ -21,6 +19,7 @@ import { init } from "../main.js"; import { registerGlobalKeybinds } from "./globalKeybinds.js"; import { registerIpc } from "./ipc.js"; import { setMenu } from "./menu.js"; +import { startRPC } from "./rpcProcess.js"; import { registerCustomHandler } from "./screenshare.js"; import { mainTouchBar } from "./touchbar.js"; import { createTray, tray } from "./tray.js"; @@ -296,30 +295,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`); }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { - const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { - env: { detectables: JSON.stringify(getDetectables()) }, - }); - - child.on("spawn", () => { - console.log("arRPC process started"); - console.log(child.pid); - }); - - child.on("message", (message) => { - const json = JSON.parse(message); - if (json.type === "invite") { - createInviteWindow(json.code); - } else if (json.type === "activity") { - console.log("activity pulse"); - console.log(json.data); - passedWindow.webContents.send("rpc", json.data); - } - }); - - child.on("exit", () => { - console.log("arRPC process exited"); - console.log(child.pid); - }); + startRPC(passedWindow); } if (firstRun) { passedWindow.close(); diff --git a/src/rpc.ts b/src/rpc.ts index 559364b2..3ed3d607 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -16,3 +16,12 @@ RPC.on("invite", (code: string) => { const response = { type: "invite", code: code }; process.parentPort.postMessage(JSON.stringify(response)); }); + +process.parentPort.once("message", async (e) => { + if (e.data.message === "refreshProcessList") { + const processes = await RPC.getProcessesList(); + console.log(processes); + const response = { type: "processList", data: processes }; + process.parentPort.postMessage(JSON.stringify(response)); + } +}); diff --git a/src/shelter/rpc/index.ts b/src/shelter/rpc/index.ts index b95b4553..800b426b 100644 --- a/src/shelter/rpc/index.ts +++ b/src/shelter/rpc/index.ts @@ -5,7 +5,7 @@ const { } = shelter; export function onLoad() { - window.LegcordRPC.listen( + window.legcord.rpc.listen( async (msg: { activity: { assets: { large_image: string | null | undefined; small_image: string | null | undefined };