From 56dd9ea2c885a50dfd21d37e8d4d835d763cafbe Mon Sep 17 00:00:00 2001 From: kaitlynkitty <87152313+kaitlynkittyy@users.noreply.github.com> Date: Wed, 11 Oct 2023 11:52:10 -0400 Subject: [PATCH] fix audio and quality settings menu on wayland (#131) Co-authored-by: V --- src/main/screenShare.ts | 37 ++++++++++++------- src/renderer/components/ScreenSharePicker.tsx | 18 ++++++--- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index 8703bff..b63497b 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -10,6 +10,9 @@ import { IpcEvents } from "shared/IpcEvents"; import { handle } from "./utils/ipcWrappers"; +const isWayland = + process.platform === "linux" && (process.env.XDG_SESSION_TYPE === "wayland" || !!process.env.WAYLAND_DISPLAY); + export function registerScreenShareHandler() { handle(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, async (_, id: string) => { const sources = await desktopCapturer.getSources({ @@ -23,17 +26,19 @@ export function registerScreenShareHandler() { }); session.defaultSession.setDisplayMediaRequestHandler(async (request, callback) => { - const sources = await desktopCapturer.getSources({ - types: ["window", "screen"], - thumbnailSize: { - width: 176, - height: 99 - } - }); + // request full resolution on wayland right away because we always only end up with one result anyway + const width = isWayland ? 1920 : 176; + const sources = await desktopCapturer + .getSources({ + types: ["window", "screen"], + thumbnailSize: { + width, + height: width * (9 / 16) + } + }) + .catch(err => console.error("Error during screenshare picker", err)); - const isWayland = - process.platform === "linux" && - (process.env.XDG_SESSION_TYPE === "wayland" || !!process.env.WAYLAND_DISPLAY); + if (!sources) return callback({}); const data = sources.map(({ id, name, thumbnail }) => ({ id, @@ -43,10 +48,14 @@ export function registerScreenShareHandler() { if (isWayland) { const video = data[0]; - if (video) - await request.frame.executeJavaScript( - `Vesktop.Components.ScreenShare.openScreenSharePicker(${JSON.stringify([data])}, true)` - ); + if (video) { + const stream = await request.frame + .executeJavaScript( + `Vesktop.Components.ScreenShare.openScreenSharePicker(${JSON.stringify([video])},true)` + ) + .catch(() => null); + if (stream === null) return callback({}); + } callback(video ? { video: sources[0] } : {}); return; diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index f62c84a..fc0cd0c 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -71,7 +71,7 @@ addPatch({ } }); -export function openScreenSharePicker(screens: Source[], skipPicker = false) { +export function openScreenSharePicker(screens: Source[], skipPicker: boolean) { let didSubmit = false; return new Promise((resolve, reject) => { const key = openModal( @@ -119,16 +119,21 @@ function ScreenPicker({ screens, chooseScreen }: { screens: Source[]; chooseScre function StreamSettings({ source, settings, - setSettings + setSettings, + skipPicker }: { source: Source; settings: StreamSettings; setSettings: Dispatch>; + skipPicker: boolean; }) { - const [thumb] = useAwaiter(() => VesktopNative.capturer.getLargeThumbnail(source.id), { - fallbackValue: source.url, - deps: [source.id] - }); + const [thumb] = useAwaiter( + () => (skipPicker ? Promise.resolve(source.url) : VesktopNative.capturer.getLargeThumbnail(source.id)), + { + fallbackValue: source.url, + deps: [source.id] + } + ); return (
@@ -269,6 +274,7 @@ function ModalComponent({ source={screens.find(s => s.id === selected)!} settings={settings} setSettings={setSettings} + skipPicker={skipPicker} /> )}