Add a way to enable legacy capturer

This commit is contained in:
smartfridge 2022-12-25 21:43:35 +01:00
parent 2dec7c21dc
commit 09fcd77803
9 changed files with 68 additions and 40 deletions

View file

@ -120,6 +120,7 @@
alternativePaste: false,
automaticPatches: false,
mods: "none",
useLegacyCapturer: false,
inviteWebsocket: true,
mobileMode: false,
trayIcon: "default",
@ -154,6 +155,7 @@
mobileMode: false,
automaticPatches: false,
performanceMode: "none",
useLegacyCapturer: false,
alternativePaste: false,
disableAutogain: false,
startMinimized: false,
@ -173,6 +175,7 @@
mobileMode: false,
disableAutogain: false,
mods: "none",
useLegacyCapturer: false,
startMinimized: false,
alternativePaste: false,
performanceMode: "none",

View file

@ -118,6 +118,9 @@ export function registerIpc() {
ipcMain.on("clientmod", async (event, arg) => {
event.returnValue = await getConfig("mods");
});
ipcMain.on("legacyCapturer", async (event, arg) => {
event.returnValue = await getConfig("useLegacyCapturer");
});
ipcMain.on("trayIcon", async (event, arg) => {
event.returnValue = await getConfig("trayIcon");
});
@ -143,4 +146,5 @@ export function registerIpc() {
event.returnValue = false;
}
});
ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) => desktopCapturer.getSources(opts));
}

View file

@ -1,6 +1,40 @@
import {contextBridge, ipcRenderer} from "electron";
import {injectTitlebar} from "./titlebar";
const CANCEL_ID = "desktop-capturer-selection__cancel";
const desktopCapturer = {
getSources: (opts: any) => ipcRenderer.invoke("DESKTOP_CAPTURER_GET_SOURCES", opts)
};
interface IPCSources {
id: string;
name: string;
thumbnail: HTMLCanvasElement;
}
async function getDisplayMediaSelector() {
const sources: IPCSources[] = await desktopCapturer.getSources({
types: ["screen", "window"]
});
return `<div class="desktop-capturer-selection__scroller">
<ul class="desktop-capturer-selection__list">
${sources
.map(
({id, name, thumbnail}) => `
<li class="desktop-capturer-selection__item">
<button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
<img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" />
<span class="desktop-capturer-selection__name">${name}</span>
</button>
</li>
`
)
.join("")}
<li class="desktop-capturer-selection__item">
<button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel">
<span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
</button>
</li>
</ul>
</div>`;
}
contextBridge.exposeInMainWorld("armcord", {
window: {
show: () => ipcRenderer.send("win-show"),
@ -20,6 +54,7 @@ contextBridge.exposeInMainWorld("armcord", {
ipcRenderer.invoke("getLang", toGet).then((result) => {
return result;
}),
getDisplayMediaSelector: getDisplayMediaSelector,
version: ipcRenderer.sendSync("get-app-version", "app-version"),
mods: ipcRenderer.sendSync("clientmod"),
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),

View file

@ -1,47 +1,11 @@
//Fixed context isolation version https://github.com/getferdi/ferdi/blob/develop/src/webview/screenshare.ts
//original https://github.com/electron/electron/issues/16513#issuecomment-602070250
import {ipcRenderer} from "electron";
import {addStyle, addScript} from "../utils";
import fs from "fs";
import path from "path";
const desktopCapturer = {
getSources: (opts: any) => ipcRenderer.invoke("DESKTOP_CAPTURER_GET_SOURCES", opts)
};
const CANCEL_ID = "desktop-capturer-selection__cancel";
interface IPCSources {
id: string;
name: string;
thumbnail: HTMLCanvasElement;
}
export async function getDisplayMediaSelector() {
const sources: IPCSources[] = await desktopCapturer.getSources({
types: ["screen", "window"]
});
return `<div class="desktop-capturer-selection__scroller">
<ul class="desktop-capturer-selection__list">
${sources
.map(
({id, name, thumbnail}) => `
<li class="desktop-capturer-selection__item">
<button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
<img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" />
<span class="desktop-capturer-selection__name">${name}</span>
</button>
</li>
`
)
.join("")}
<li class="desktop-capturer-selection__item">
<button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel">
<span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
</button>
</li>
</ul>
</div>`;
}
const screenShareJS = `
window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => {
try {

View file

@ -1,6 +1,5 @@
import {ipcRenderer} from "electron";
import "./bridge";
//import "./capturer";
import "./patch";
import * as fs from "fs";
import * as path from "path";
@ -8,6 +7,10 @@ import {fixTitlebar, injectTitlebar} from "./titlebar";
import {sleep, addStyle, addScript} from "../utils";
import {injectMobileStuff} from "./mobile";
window.localStorage.setItem("hideNag", "true");
if (ipcRenderer.sendSync("legacyCapturer")) {
console.warn("Using legacy capturer module");
import("./capturer");
}
var version = ipcRenderer.sendSync("displayVersion");
var channel = ipcRenderer.sendSync("channel");
async function updateLang() {

View file

@ -191,6 +191,18 @@
<p data-string="settings-skipSplash-desc" class="description"></p>
</div>
<br />
<div>
<label class="header" data-string="settings-useLegacyCapturer"></label>
<input
id="useLegacyCapturer"
class="tgl tgl-light left"
data-setting="useLegacyCapturer"
type="checkbox"
/>
<label class="tgl-btn left" for="useLegacyCapturer"></label>
<p data-string="settings-useLegacyCapturer-desc" class="description"></p>
</div>
<br />
<button data-string="settings-pluginsFolder" data-open="Plugins" class="center"></button>
<br />
<button data-string="settings-themesFolder" data-open="Themes" class="center"></button>

View file

@ -51,6 +51,7 @@ export function setup() {
inviteWebsocket: true,
startMinimized: false,
disableAutogain: false,
useLegacyCapturer: false,
mobileMode: false,
trayIcon: "default",
doneSetup: false
@ -244,6 +245,7 @@ export interface Settings {
skipSplash: boolean;
performanceMode: string;
startMinimized: boolean;
useLegacyCapturer: boolean;
inviteWebsocket: boolean;
disableAutogain: boolean;
trayIcon: string;

View file

@ -130,7 +130,10 @@ async function doAfterDefiningTheWindow() {
}
return {action: "deny"};
});
import("./screenshare/main");
if ((await getConfig("useLegacyCapturer")) == false) {
console.log("Starting screenshare module...");
import("./screenshare/main");
}
mainWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
if (/api\/v\d\/science$/g.test(details.url)) return callback({cancel: true});
return callback({});