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; | ||||
|         } | ||||
|     }); | ||||
|     ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) => desktopCapturer.getSources(opts)); | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| import {contextBridge, ipcRenderer} from "electron"; | ||||
| import {getDisplayMediaSelector} from "./capturer"; | ||||
| import {injectTitlebar} from "./titlebar"; | ||||
| 
 | ||||
| contextBridge.exposeInMainWorld("armcord", { | ||||
|  | @ -24,7 +23,6 @@ contextBridge.exposeInMainWorld("armcord", { | |||
|     version: ipcRenderer.sendSync("get-app-version", "app-version"), | ||||
|     mods: ipcRenderer.sendSync("clientmod"), | ||||
|     packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"), | ||||
|     getDisplayMediaSelector: getDisplayMediaSelector, | ||||
|     splashEnd: () => ipcRenderer.send("splashEnd"), | ||||
|     openSettingsWindow: () => ipcRenderer.send("openSettingsWindow") | ||||
| }); | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| import {ipcRenderer} from "electron"; | ||||
| import "./bridge"; | ||||
| import "./capturer"; | ||||
| //import "./capturer";
 | ||||
| import "./patch"; | ||||
| import * as fs from "fs"; | ||||
| 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() { | ||||
|     var elem = document.createElement("div"); | ||||
|     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"}; | ||||
|     }); | ||||
|     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({}); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue