@@ -20,7 +20,7 @@ import {
2020 useState
2121} from "@vencord/types/webpack/common" ;
2222import type { Dispatch , SetStateAction } from "react" ;
23- import { patchAudioWithDevice } from "renderer/patches/screenShareAudio " ;
23+ import { patchDisplayMedia } from "renderer/patches/screenSharePatch " ;
2424import { addPatch } from "renderer/patches/shared" ;
2525import { isLinux , isWindows } from "renderer/utils" ;
2626
@@ -42,6 +42,7 @@ interface StreamSettings {
4242
4343export interface StreamPick extends StreamSettings {
4444 id : string ;
45+ cameraId ?: string ;
4546}
4647
4748interface Source {
@@ -50,6 +51,11 @@ interface Source {
5051 url : string ;
5152}
5253
54+ interface Camera {
55+ id : string ;
56+ name : string ;
57+ }
58+
5359let currentSettings : StreamSettings | null = null ;
5460
5561addPatch ( {
@@ -96,6 +102,7 @@ if (isLinux) {
96102
97103export function openScreenSharePicker ( screens : Source [ ] , skipPicker : boolean ) {
98104 let didSubmit = false ;
105+
99106 return new Promise < StreamPick > ( ( resolve , reject ) => {
100107 const key = openModal (
101108 props => (
@@ -105,6 +112,12 @@ export function openScreenSharePicker(screens: Source[], skipPicker: boolean) {
105112 submit = { async v => {
106113 didSubmit = true ;
107114
115+ patchDisplayMedia ( {
116+ audioId : v . audioDevice ,
117+ venmic : ! ! v . audioSource && v . audioSource !== "None" ,
118+ videoId : v . cameraId
119+ } ) ;
120+
108121 if ( ! v . audioDevice && v . audioSource && v . audioSource !== "None" ) {
109122 if ( v . audioSource === "Entire System" ) {
110123 await VesktopNative . virtmic . startSystem ( ) ;
@@ -113,8 +126,6 @@ export function openScreenSharePicker(screens: Source[], skipPicker: boolean) {
113126 }
114127 }
115128
116- if ( v . audioDevice ) patchAudioWithDevice ( v . audioDevice ) ;
117-
118129 resolve ( v ) ;
119130 } }
120131 close = { ( ) => {
@@ -134,12 +145,26 @@ export function openScreenSharePicker(screens: Source[], skipPicker: boolean) {
134145 } ) ;
135146}
136147
137- function ScreenPicker ( { screens, chooseScreen } : { screens : Source [ ] ; chooseScreen : ( id : string ) => void } ) {
148+ function ScreenPicker ( {
149+ screens,
150+ chooseScreen,
151+ isDisabled = false
152+ } : {
153+ screens : Source [ ] ;
154+ chooseScreen : ( id : string ) => void ;
155+ isDisabled ?: boolean ;
156+ } ) {
138157 return (
139158 < div className = "vcd-screen-picker-grid" >
140159 { screens . map ( ( { id, name, url } ) => (
141160 < label key = { id } >
142- < input type = "radio" name = "screen" value = { id } onChange = { ( ) => chooseScreen ( id ) } />
161+ < input
162+ type = "radio"
163+ name = "screen"
164+ value = { id }
165+ onChange = { ( ) => chooseScreen ( id ) }
166+ disabled = { isDisabled }
167+ />
143168
144169 < img src = { url } alt = "" />
145170 < Text variant = "text-sm/normal" > { name } </ Text >
@@ -149,6 +174,37 @@ function ScreenPicker({ screens, chooseScreen }: { screens: Source[]; chooseScre
149174 ) ;
150175}
151176
177+ function CameraPicker ( {
178+ camera,
179+ chooseCamera
180+ } : {
181+ camera : string | undefined ;
182+ chooseCamera : ( id : string | undefined ) => void ;
183+ } ) {
184+ const [ cameras ] = useAwaiter (
185+ ( ) =>
186+ navigator . mediaDevices
187+ . enumerateDevices ( )
188+ . then ( res =>
189+ res
190+ . filter ( d => d . kind === "videoinput" )
191+ . map ( d => ( { id : d . deviceId , name : d . label } ) satisfies Camera )
192+ ) ,
193+ { fallbackValue : [ ] }
194+ ) ;
195+
196+ return (
197+ < Select
198+ clearable = { true }
199+ options = { cameras . map ( s => ( { label : s . name , value : s . id } ) ) }
200+ isSelected = { s => s === camera }
201+ select = { s => chooseCamera ( s ) }
202+ clear = { ( ) => chooseCamera ( undefined ) }
203+ serialize = { String }
204+ />
205+ ) ;
206+ }
207+
152208function StreamSettings ( {
153209 source,
154210 settings,
@@ -171,6 +227,7 @@ function StreamSettings({
171227 return (
172228 < div >
173229 < Forms . FormTitle > What you're streaming</ Forms . FormTitle >
230+
174231 < Card className = "vcd-screen-picker-card vcd-screen-picker-preview" >
175232 < img src = { thumb } alt = "" />
176233 < Text variant = "text-sm/normal" > { source . name } </ Text >
@@ -257,7 +314,7 @@ function AudioSourceAnyDevice({
257314 audioDevice ?: string ;
258315 setAudioDevice ( s : string | undefined ) : void ;
259316} ) {
260- const [ sources , _ , loading ] = useAwaiter (
317+ const [ sources ] = useAwaiter (
261318 ( ) =>
262319 navigator . mediaDevices
263320 . enumerateDevices ( )
@@ -341,11 +398,8 @@ function ModalComponent({
341398 skipPicker : boolean ;
342399} ) {
343400 const [ selected , setSelected ] = useState < string | undefined > ( skipPicker ? screens [ 0 ] . id : void 0 ) ;
344- const [ settings , setSettings ] = useState < StreamSettings > ( {
345- resolution : "1080" ,
346- fps : "60" ,
347- audio : true
348- } ) ;
401+ const [ camera , setCamera ] = useState < string | undefined > ( undefined ) ;
402+ const [ settings , setSettings ] = useState < StreamSettings > ( { resolution : "1080" , fps : "60" , audio : true } ) ;
349403
350404 return (
351405 < Modals . ModalRoot { ...modalProps } >
@@ -356,7 +410,10 @@ function ModalComponent({
356410
357411 < Modals . ModalContent className = "vcd-screen-picker-modal" >
358412 { ! selected ? (
359- < ScreenPicker screens = { screens } chooseScreen = { setSelected } />
413+ < >
414+ < ScreenPicker screens = { screens } chooseScreen = { setSelected } isDisabled = { ! ! camera } />
415+ < CameraPicker camera = { camera } chooseCamera = { setCamera } />
416+ </ >
360417 ) : (
361418 < StreamSettings
362419 source = { screens . find ( s => s . id === selected ) ! }
@@ -369,7 +426,7 @@ function ModalComponent({
369426
370427 < Modals . ModalFooter className = "vcd-screen-picker-footer" >
371428 < Button
372- disabled = { ! selected }
429+ disabled = { ! selected && ! camera }
373430 onClick = { ( ) => {
374431 currentSettings = settings ;
375432
@@ -393,6 +450,7 @@ function ModalComponent({
393450
394451 submit ( {
395452 id : selected ! ,
453+ cameraId : camera ,
396454 ...settings
397455 } ) ;
398456
0 commit comments