--- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -31,7 +31,14 @@ useForceUpdater } from "@vencord/types/utils"; import { onceReady } from "@vencord/types/webpack"; -import { FluxDispatcher, MediaEngineStore, Select, UserStore, useState } from "@vencord/types/webpack/common"; +import { + FluxDispatcher, + MediaEngineStore, + Select, + useEffect, + UserStore, + useState +} from "@vencord/types/webpack/common"; import { Node } from "@vencord/venmic"; import type { Dispatch, SetStateAction } from "react"; import { addPatch } from "renderer/patches/shared"; @@ -590,6 +597,21 @@ const hasPipewirePulse = sources.ok ? sources.hasPipewirePulse : true; const [ignorePulseWarning, setIgnorePulseWarning] = useState(false); + // Once the first source list arrives, preselect whichever of the last + // stream's audio sources are running again (e.g. the same game). + const [restored, setRestored] = useState(false); + useEffect(() => { + if (restored || loading || !sources.ok) return; + setRestored(true); + + const last = State.store.screenshareAudio; + if (includeSources !== "None" || !last || last === "None") return; + if (last === "Entire System") return setIncludeSources(last); + + const running = last.filter(l => sources.targets.some(t => hasMatchingProps(l, t))); + if (running.length) setIncludeSources(running); + }, [loading]); + if (!sources.ok && sources.isGlibCxxOutdated) { return ( @@ -746,6 +768,7 @@ disabled={!selected} onClick={() => { currentSettings = settings; + if (isLinux) State.store.screenshareAudio = settings.includeSources; try { const frameRate = Number(qualitySettings.frameRate); const height = Number(qualitySettings.resolution); --- a/src/renderer/settings.ts +++ b/src/renderer/settings.ts @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import type { Node } from "@vencord/venmic"; import { useEffect, useReducer } from "@vencord/types/webpack/common"; import { SettingsStore } from "shared/utils/SettingsStore"; @@ -37,6 +38,8 @@ resolution: string; frameRate: string; }; + // audio sources picked for the last stream, preselected when running again + screenshareAudio?: "None" | "Entire System" | Node[]; } const stateKey = "VesktopState";