From 3295a7d34413dd8d523d99b9ee12948a2be8d501 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Fri, 16 May 2025 21:00:32 +0200 Subject: [PATCH] migrate executeJavaScript calls to new command system --- src/main/autoStart.ts | 19 ++++++++++--------- src/main/screenShare.ts | 27 ++++++++++++++------------- src/renderer/ipcCommands.ts | 7 +++++++ src/shared/IpcEvents.ts | 6 +++++- src/shared/utils/text.ts | 15 +++++++++++++++ 5 files changed, 51 insertions(+), 23 deletions(-) create mode 100644 src/shared/utils/text.ts diff --git a/src/main/autoStart.ts b/src/main/autoStart.ts index 958dbb9..6569473 100644 --- a/src/main/autoStart.ts +++ b/src/main/autoStart.ts @@ -7,6 +7,7 @@ import { app } from "electron"; import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "fs"; import { join } from "path"; +import { stripIndent } from "shared/utils/text"; interface AutoStart { isEnabled(): boolean; @@ -31,15 +32,15 @@ function makeAutoStartLinux(): AutoStart { return { isEnabled: () => existsSync(file), enable() { - const desktopFile = ` -[Desktop Entry] -Type=Application -Name=Vesktop -Comment=Vesktop autostart script -Exec=${commandLine} -StartupNotify=false -Terminal=false -`.trim(); + const desktopFile = stripIndent` + [Desktop Entry] + Type=Application + Name=Vesktop + Comment=Vesktop autostart script + Exec=${commandLine} + StartupNotify=false + Terminal=false + `; mkdirSync(dir, { recursive: true }); writeFileSync(file, desktopFile); diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index 5ba93a8..a96b1ce 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -6,8 +6,9 @@ import { desktopCapturer, session, Streams } from "electron"; import type { StreamPick } from "renderer/components/ScreenSharePicker"; -import { IpcEvents } from "shared/IpcEvents"; +import { IpcCommands, IpcEvents } from "shared/IpcEvents"; +import { sendRendererCommand } from "./ipcCommands"; import { handle } from "./utils/ipcWrappers"; const isWayland = @@ -49,11 +50,11 @@ export function registerScreenShareHandler() { if (isWayland) { const video = data[0]; if (video) { - const stream = await request - .frame!.executeJavaScript( - `Vesktop.Components.ScreenShare.openScreenSharePicker(${JSON.stringify([video])},true)` - ) - .catch(() => null); + const stream = await sendRendererCommand(IpcCommands.SCREEN_SHARE_PICKER, { + screens: [video], + skipPicker: true + }).catch(() => null); + if (stream === null) return callback({}); } @@ -61,13 +62,13 @@ export function registerScreenShareHandler() { return; } - const choice = await request - .frame!.executeJavaScript(`Vesktop.Components.ScreenShare.openScreenSharePicker(${JSON.stringify(data)})`) - .then(e => e as StreamPick) - .catch(e => { - console.error("Error during screenshare picker", e); - return null; - }); + const choice = await sendRendererCommand(IpcCommands.SCREEN_SHARE_PICKER, { + screens: data, + skipPicker: false + }).catch(e => { + console.error("Error during screenshare picker", e); + return null; + }); if (!choice) return callback({}); diff --git a/src/renderer/ipcCommands.ts b/src/renderer/ipcCommands.ts index 1c41769..5d51faa 100644 --- a/src/renderer/ipcCommands.ts +++ b/src/renderer/ipcCommands.ts @@ -7,6 +7,8 @@ import { SettingsRouter } from "@vencord/types/webpack/common"; import { IpcCommands } from "shared/IpcEvents"; +import { openScreenSharePicker } from "./components/ScreenSharePicker"; + type IpcCommandHandler = (data: any) => any; const handlers = new Map(); @@ -46,4 +48,9 @@ export function offIpcCommand(channel: string) { onIpcCommand(IpcCommands.NAVIGATE_SETTINGS, () => { SettingsRouter.open("My Account"); }); + onIpcCommand(IpcCommands.GET_LANGUAGES, () => navigator.languages); + +onIpcCommand(IpcCommands.SCREEN_SHARE_PICKER, data => { + openScreenSharePicker(data.screens, data.skipPicker); +}); diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index dd05e3b..e2da5db 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -62,6 +62,10 @@ export const enum IpcCommands { RPC_ACTIVITY = "rpc:activity", RPC_INVITE = "rpc:invite", RPC_DEEP_LINK = "rpc:link", + NAVIGATE_SETTINGS = "navigate:settings", - GET_LANGUAGES = "navigator.languages" + + GET_LANGUAGES = "navigator.languages", + + SCREEN_SHARE_PICKER = "screenshare:picker" } diff --git a/src/shared/utils/text.ts b/src/shared/utils/text.ts new file mode 100644 index 0000000..554ef01 --- /dev/null +++ b/src/shared/utils/text.ts @@ -0,0 +1,15 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2025 Vendicated and Vesktop contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +export function stripIndent(strings: TemplateStringsArray, ...values: any[]) { + const string = String.raw({ raw: strings }, ...values); + + const match = string.match(/^[ \t]*(?=\S)/gm); + if (!match) return string.trim(); + + const minIndent = match.reduce((r, a) => Math.min(r, a.length), Infinity); + return string.replace(new RegExp(`^[ \\t]{${minIndent}}`, "gm"), "").trim(); +}