diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 3515323f4a..27127e4005 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -1678,7 +1678,7 @@ fn open_external_link(app: tauri::AppHandle, url: String) -> Result<(), String> #[tauri::command] #[specta::specta] -async fn reset_camera_permissions(_app: AppHandle) -> Result<(), ()> { +async fn reset_camera_permissions(_app: AppHandle) -> Result<(), String> { #[cfg(target_os = "macos")] { #[cfg(debug_assertions)] @@ -1692,7 +1692,7 @@ async fn reset_camera_permissions(_app: AppHandle) -> Result<(), ()> { .arg("Camera") .arg(bundle_id) .output() - .expect("Failed to reset camera permissions"); + .map_err(|_| "Failed to reset camera permissions".to_string())?; } Ok(()) diff --git a/apps/desktop/src-tauri/src/permissions.rs b/apps/desktop/src-tauri/src/permissions.rs index bb1c508102..36287bf046 100644 --- a/apps/desktop/src-tauri/src/permissions.rs +++ b/apps/desktop/src-tauri/src/permissions.rs @@ -61,15 +61,25 @@ pub fn open_permission_settings(permission: OSPermission) { pub async fn request_permission(permission: OSPermission) { #[cfg(target_os = "macos")] { + use futures::executor::block_on; + match permission { OSPermission::ScreenRecording => { scap::request_permission(); } OSPermission::Camera => { - av::CaptureDevice::request_access_for_media_type(av::MediaType::video()); + std::thread::spawn(|| { + let _ = block_on(av::CaptureDevice::request_access_for_media_type( + av::MediaType::video(), + )); + }); } OSPermission::Microphone => { - av::CaptureDevice::request_access_for_media_type(av::MediaType::audio()); + std::thread::spawn(|| { + let _ = block_on(av::CaptureDevice::request_access_for_media_type( + av::MediaType::audio(), + )); + }); } OSPermission::Accessibility => request_accessibility_permission(), } diff --git a/apps/desktop/src/routes/(window-chrome)/(main).tsx b/apps/desktop/src/routes/(window-chrome)/(main).tsx index d8413b777a..d446c8bc4c 100644 --- a/apps/desktop/src/routes/(window-chrome)/(main).tsx +++ b/apps/desktop/src/routes/(window-chrome)/(main).tsx @@ -422,7 +422,6 @@ function Page() { options={cameras} value={options.cameraID() ?? null} onChange={(v) => { - console.log({ v }); if (!v) setCamera.mutate(null); else if (v.model_id) setCamera.mutate({ ModelID: v.model_id }); else setCamera.mutate({ DeviceID: v.device_id }); @@ -574,7 +573,6 @@ function AreaSelectButton(props: { } const { screen } = props; - console.log({ screen }); if (!screen) return; trackEvent("crop_area_enabled", { @@ -719,6 +717,11 @@ function CameraSelect(props: { disabled={!!currentRecording.data || props.disabled} class="flex flex-row items-center h-[2rem] px-[0.375rem] gap-[0.375rem] border rounded-lg border-gray-3 w-full disabled:text-gray-11 transition-colors KSelect" onClick={() => { + if (!permissionGranted()) { + requestPermission("camera"); + return; + } + Promise.all([ CheckMenuItem.new({ text: NO_CAMERA, @@ -820,6 +823,11 @@ function MicrophoneSelect(props: { disabled={!!currentRecording.data || props.disabled} class="relative flex flex-row items-center h-[2rem] px-[0.375rem] gap-[0.375rem] border rounded-lg border-gray-3 w-full disabled:text-gray-11 transition-colors KSelect overflow-hidden z-10" onClick={() => { + if (!permissionGranted()) { + requestPermission("microphone"); + return; + } + Promise.all([ CheckMenuItem.new({ text: NO_MICROPHONE, @@ -930,7 +938,6 @@ function TargetSelect(props: { disabled={props.disabled} onClick={() => { if (props.options.length > 1) { - console.log({ options: props.options, value: props.value }); Promise.all( props.options.map((o) => CheckMenuItem.new({ @@ -976,6 +983,7 @@ function TargetSelectInfoPill(props: { onClick={(e) => { if (!props.permissionGranted) { props.requestPermission(); + e.stopPropagation(); return; }