mirror of
https://github.com/smartfrigde/armcord.git
synced 2024-08-14 23:56:58 +00:00
Rewrite capturer
This commit is contained in:
parent
e0313c01dd
commit
9b6175ca6d
8 changed files with 107 additions and 51 deletions
|
@ -143,5 +143,4 @@ export function registerIpc() {
|
||||||
event.returnValue = false;
|
event.returnValue = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) => desktopCapturer.getSources(opts));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import {contextBridge, ipcRenderer} from "electron";
|
import {contextBridge, ipcRenderer} from "electron";
|
||||||
import {getDisplayMediaSelector} from "./capturer";
|
|
||||||
import {injectTitlebar} from "./titlebar";
|
import {injectTitlebar} from "./titlebar";
|
||||||
|
|
||||||
contextBridge.exposeInMainWorld("armcord", {
|
contextBridge.exposeInMainWorld("armcord", {
|
||||||
|
@ -24,7 +23,6 @@ contextBridge.exposeInMainWorld("armcord", {
|
||||||
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
||||||
mods: ipcRenderer.sendSync("clientmod"),
|
mods: ipcRenderer.sendSync("clientmod"),
|
||||||
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),
|
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),
|
||||||
getDisplayMediaSelector: getDisplayMediaSelector,
|
|
||||||
splashEnd: () => ipcRenderer.send("splashEnd"),
|
splashEnd: () => ipcRenderer.send("splashEnd"),
|
||||||
openSettingsWindow: () => ipcRenderer.send("openSettingsWindow")
|
openSettingsWindow: () => ipcRenderer.send("openSettingsWindow")
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import {ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
import "./bridge";
|
import "./bridge";
|
||||||
import "./capturer";
|
//import "./capturer";
|
||||||
import "./patch";
|
import "./patch";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
|
|
|
@ -54,54 +54,7 @@ export function injectTitlebar() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
export function injectHummusTitlebar() {
|
|
||||||
document.addEventListener("DOMContentLoaded", function (event) {
|
|
||||||
var elem = document.createElement("div");
|
|
||||||
elem.innerHTML = `
|
|
||||||
<button class="win-minimize" id="minimize"></button><button class="win-maximize" id="maximize"></button><button class="win-close" id="quit"></button>
|
|
||||||
`;
|
|
||||||
elem.classList.add("win-buttons");
|
|
||||||
elem.classList.add("win-buttons-light");
|
|
||||||
document.getElementsByClassName("titlebar")[0].appendChild(elem);
|
|
||||||
document.body.setAttribute("customTitlebar", "");
|
|
||||||
document.body.setAttribute("hummus", "");
|
|
||||||
document.body.setAttribute("armcord-platform", os.platform());
|
|
||||||
addStyle(`
|
|
||||||
html, body {
|
|
||||||
background-color: #1e2124;
|
|
||||||
}
|
|
||||||
|
|
||||||
.friends-header,
|
|
||||||
.chat > .title-wrap {
|
|
||||||
float: right !important;
|
|
||||||
padding-right: 140px !important;
|
|
||||||
}`);
|
|
||||||
var minimize = document.getElementById("minimize");
|
|
||||||
var maximize = document.getElementById("maximize");
|
|
||||||
var quit = document.getElementById("quit");
|
|
||||||
|
|
||||||
minimize!.addEventListener("click", () => {
|
|
||||||
ipcRenderer.send("win-minimize");
|
|
||||||
});
|
|
||||||
|
|
||||||
maximize!.addEventListener("click", () => {
|
|
||||||
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
|
||||||
ipcRenderer.send("win-unmaximize");
|
|
||||||
document.body.removeAttribute("isMaximized");
|
|
||||||
} else if (ipcRenderer.sendSync("win-isNormal") == true) {
|
|
||||||
ipcRenderer.send("win-maximize");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
quit!.addEventListener("click", () => {
|
|
||||||
if (ipcRenderer.sendSync("minimizeToTray") === true) {
|
|
||||||
ipcRenderer.send("win-hide");
|
|
||||||
} else if (ipcRenderer.sendSync("minimizeToTray") === false) {
|
|
||||||
ipcRenderer.send("win-quit");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
export function fixTitlebar() {
|
export function fixTitlebar() {
|
||||||
var elem = document.createElement("div");
|
var elem = document.createElement("div");
|
||||||
elem.innerHTML = `<nav class="titlebar">
|
elem.innerHTML = `<nav class="titlebar">
|
||||||
|
|
37
src/screenshare/main.ts
Normal file
37
src/screenshare/main.ts
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import {BrowserWindow, desktopCapturer, ipcMain, session, shell} from "electron";
|
||||||
|
import path from "path";
|
||||||
|
import {iconPath} from "../main";
|
||||||
|
var capturerWindow: BrowserWindow;
|
||||||
|
session.defaultSession.setDisplayMediaRequestHandler(async (request, callback) => {
|
||||||
|
const sources = await desktopCapturer.getSources({
|
||||||
|
types: ["screen", "window"]
|
||||||
|
});
|
||||||
|
console.log(sources);
|
||||||
|
capturerWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
title: "ArmCord Screenshare",
|
||||||
|
darkTheme: true,
|
||||||
|
icon: iconPath,
|
||||||
|
frame: true,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
|
spellcheck: false,
|
||||||
|
preload: path.join(__dirname, "preload.js")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ipcMain.on("selectScreenshareSource", (event, id, name) => {
|
||||||
|
console.log(sources[id]);
|
||||||
|
console.log(id);
|
||||||
|
callback({video: {id, name}});
|
||||||
|
|
||||||
|
capturerWindow.close();
|
||||||
|
});
|
||||||
|
capturerWindow.webContents.setWindowOpenHandler(({url}) => {
|
||||||
|
shell.openExternal(url);
|
||||||
|
return {action: "deny"};
|
||||||
|
});
|
||||||
|
capturerWindow.loadURL(`file://${__dirname}/picker.html`);
|
||||||
|
capturerWindow.webContents.send("getSources", sources);
|
||||||
|
});
|
13
src/screenshare/picker.html
Normal file
13
src/screenshare/picker.html
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>ArmCord Screenshare</title>
|
||||||
|
<style>
|
||||||
|
@import url("../content/css/screenshare.css");
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
55
src/screenshare/preload.ts
Normal file
55
src/screenshare/preload.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import {IpcMain, ipcRenderer} from "electron";
|
||||||
|
interface IPCSources {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
thumbnail: HTMLCanvasElement;
|
||||||
|
}
|
||||||
|
async function addDisplays() {
|
||||||
|
ipcRenderer.on("getSources", (event, arg) => {
|
||||||
|
var sources: IPCSources[] = arg;
|
||||||
|
console.log(sources);
|
||||||
|
const selectionElem = document.createElement("div");
|
||||||
|
//@ts-ignore
|
||||||
|
selectionElem.classList = ["desktop-capturer-selection"];
|
||||||
|
selectionElem.innerHTML = `<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="screen-cancel" title="Cancel">
|
||||||
|
<span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>`;
|
||||||
|
document.body.appendChild(selectionElem);
|
||||||
|
document.querySelectorAll(".desktop-capturer-selection__btn").forEach((button) => {
|
||||||
|
button.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
const id = button.getAttribute("data-id");
|
||||||
|
const title = button.getAttribute("title");
|
||||||
|
if (id === "${CANCEL_ID}") {
|
||||||
|
new Error("Cancelled by user");
|
||||||
|
} else {
|
||||||
|
ipcRenderer.sendSync("selectScreenshareSource", id, title);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
} finally {
|
||||||
|
ipcRenderer.sendSync("closeScreenshareWindow");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
addDisplays();
|
|
@ -130,6 +130,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
}
|
}
|
||||||
return {action: "deny"};
|
return {action: "deny"};
|
||||||
});
|
});
|
||||||
|
import("./screenshare/main");
|
||||||
mainWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
mainWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
||||||
if (/api\/v\d\/science$/g.test(details.url)) return callback({cancel: true});
|
if (/api\/v\d\/science$/g.test(details.url)) return callback({cancel: true});
|
||||||
return callback({});
|
return callback({});
|
||||||
|
|
Loading…
Reference in a new issue