From fb0846f8fbc37a2526588762b95157899a3b1a99 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 19:54:33 +0800 Subject: [PATCH 1/3] wip --- apps/desktop/src-tauri/src/lib.rs | 4 ++ .../src-tauri/src/target_select_overlay.rs | 47 +++++++++++++++---- .../src/routes/target-select-overlay.tsx | 6 --- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 2a0eb78225..1e75a06674 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2184,6 +2184,10 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { #[cfg(target_os = "macos")] app.manage(crate::platform::ScreenCapturePrewarmer::default()); + tokio::spawn(async move { + target_select_overlay::init(&app).await; + }); + tokio::spawn({ let camera_feed = camera_feed.clone(); let app = app.clone(); diff --git a/apps/desktop/src-tauri/src/target_select_overlay.rs b/apps/desktop/src-tauri/src/target_select_overlay.rs index 31a030d6b7..b4a1561ba6 100644 --- a/apps/desktop/src-tauri/src/target_select_overlay.rs +++ b/apps/desktop/src-tauri/src/target_select_overlay.rs @@ -7,6 +7,7 @@ use std::{ use base64::prelude::*; use cap_recording::screen_capture::ScreenCaptureTarget; +use futures::future::join_all; use crate::windows::{CapWindowId, ShowCapWindow}; use scap_targets::{ @@ -41,6 +42,28 @@ pub struct DisplayInformation { refresh_rate: String, } +// We create the windows hidden at app launch so they are ready when used. +// Otherwise we have noticed they can take a while to load on first interaction (especially on Windows). +pub async fn init(app: &AppHandle) { + join_all( + scap_targets::Display::list() + .into_iter() + .map(|d| d.id()) + .map(|display_id| { + let app = app.clone(); + + async move { + ShowCapWindow::TargetSelectOverlay { display_id } + .show(&app) + .await + .map_err(|err| error!("Error initializing target select overlay: {err}")) + .ok(); + } + }), + ) + .await; +} + #[specta::specta] #[tauri::command] #[instrument(skip(app, state))] @@ -49,15 +72,21 @@ pub async fn open_target_select_overlays( state: tauri::State<'_, WindowFocusManager>, focused_target: Option, ) -> Result<(), String> { - let displays = scap_targets::Display::list() - .into_iter() - .map(|d| d.id()) - .collect::>(); - for display_id in displays { - let _ = ShowCapWindow::TargetSelectOverlay { display_id } - .show(&app) - .await; - } + join_all( + scap_targets::Display::list() + .into_iter() + .map(|d| d.id()) + .map(|display_id| { + let app = app.clone(); + + async move { + ShowCapWindow::TargetSelectOverlay { display_id } + .show(&app) + .await + } + }), + ) + .await; let handle = tokio::spawn({ let app = app.clone(); diff --git a/apps/desktop/src/routes/target-select-overlay.tsx b/apps/desktop/src/routes/target-select-overlay.tsx index cecab14f97..393de284a5 100644 --- a/apps/desktop/src/routes/target-select-overlay.tsx +++ b/apps/desktop/src/routes/target-select-overlay.tsx @@ -995,9 +995,3 @@ function ResizeHandle( /> ); } - -function getDisplayId(displayId: string | undefined) { - const id = Number(displayId); - if (Number.isNaN(id)) return 0; - return id; -} From 72402c2d10b2cf74b992227f867005b5af6d724c Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 19:55:58 +0800 Subject: [PATCH 2/3] clone app --- apps/desktop/src-tauri/src/lib.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 1e75a06674..a8c948c7cc 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2184,8 +2184,11 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { #[cfg(target_os = "macos")] app.manage(crate::platform::ScreenCapturePrewarmer::default()); - tokio::spawn(async move { - target_select_overlay::init(&app).await; + tokio::spawn({ + let app = app.clone(); + async move { + target_select_overlay::init(&app).await; + } }); tokio::spawn({ From b545403a83da7a7cc40f2120092157b821d50414 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 20:20:09 +0800 Subject: [PATCH 3/3] hide instead of closing --- apps/desktop/src-tauri/src/lib.rs | 2 +- apps/desktop/src-tauri/src/recording.rs | 2 +- .../src-tauri/src/target_select_overlay.rs | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index a8c948c7cc..cbb8d1c828 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2358,7 +2358,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { if let Ok(CapWindowId::TargetSelectOverlay { .. }) = CapWindowId::from_str(&id) { - let _ = window.close(); + let _ = window.hide(); } } diff --git a/apps/desktop/src-tauri/src/recording.rs b/apps/desktop/src-tauri/src/recording.rs index 10b136e552..5e4ae9236f 100644 --- a/apps/desktop/src-tauri/src/recording.rs +++ b/apps/desktop/src-tauri/src/recording.rs @@ -415,7 +415,7 @@ pub async fn start_recording( .filter_map(|(label, win)| CapWindowId::from_str(label).ok().map(|id| (id, win))) { if matches!(id, CapWindowId::TargetSelectOverlay { .. }) { - win.close().ok(); + win.hide().ok(); } } let _ = ShowCapWindow::InProgressRecording { countdown } diff --git a/apps/desktop/src-tauri/src/target_select_overlay.rs b/apps/desktop/src-tauri/src/target_select_overlay.rs index b4a1561ba6..c0679ccb1e 100644 --- a/apps/desktop/src-tauri/src/target_select_overlay.rs +++ b/apps/desktop/src-tauri/src/target_select_overlay.rs @@ -53,11 +53,14 @@ pub async fn init(app: &AppHandle) { let app = app.clone(); async move { - ShowCapWindow::TargetSelectOverlay { display_id } + let result = ShowCapWindow::TargetSelectOverlay { display_id } .show(&app) .await - .map_err(|err| error!("Error initializing target select overlay: {err}")) - .ok(); + .map_err(|err| error!("Error initializing target select overlay: {err}")); + + if let Ok(window) = result { + window.hide().ok(); + } } }), ) @@ -83,6 +86,8 @@ pub async fn open_target_select_overlays( ShowCapWindow::TargetSelectOverlay { display_id } .show(&app) .await + .map_err(|err| error!("Error initializing target select overlay: {err}")) + .ok(); } }), ) @@ -145,7 +150,10 @@ pub async fn open_target_select_overlays( pub async fn close_target_select_overlays(app: AppHandle) -> Result<(), String> { for (id, window) in app.webview_windows() { if let Ok(CapWindowId::TargetSelectOverlay { .. }) = CapWindowId::from_str(&id) { - let _ = window.close(); + window + .hide() + .map_err(|err| error!("Error hiding target select overlay: {err}")) + .ok(); } }