From b800f1665555720a50e23af051ea5c8d82bfc81f Mon Sep 17 00:00:00 2001 From: Owen McGirr Date: Mon, 10 Aug 2026 17:36:55 +0100 Subject: [PATCH] Fix macOS updater cleanup dispatch --- src-tauri/src/lib.rs | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e94e786..d835f73 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -316,13 +316,22 @@ async fn reject_pairing( } #[tauri::command] -fn disconnect_all( - app: AppHandle, - model: State<'_, AppModel>, - overlay: State<'_, overlay::CursorOverlay>, - modifier_overlay: State<'_, modifier_overlay::ModifierOverlay>, -) -> Result { - disconnect_all_inner(&app, &model, &overlay, &modifier_overlay) +async fn disconnect_all(app: AppHandle) -> Result { + disconnect_all_on_main_thread(app).await +} + +async fn disconnect_all_on_main_thread(app: AppHandle) -> Result { + let shared = app.state::().shared.clone(); + let operation_app = app.clone(); + on_main_thread(app.clone(), move || { + platform_disconnect_all(&operation_app, &shared) + }) + .await?; + + let model = app.state::(); + let overlay = app.state::(); + let modifier_overlay = app.state::(); + Ok(finish_disconnect(&app, &model, &overlay, &modifier_overlay)) } fn disconnect_all_inner( @@ -332,6 +341,15 @@ fn disconnect_all_inner( modifier_overlay: &modifier_overlay::ModifierOverlay, ) -> Result { platform_disconnect_all(app, &model.shared)?; + Ok(finish_disconnect(app, model, overlay, modifier_overlay)) +} + +fn finish_disconnect( + app: &AppHandle, + model: &AppModel, + overlay: &overlay::CursorOverlay, + modifier_overlay: &modifier_overlay::ModifierOverlay, +) -> AppState { overlay.end_session(); modifier_overlay.end_session(); { @@ -347,8 +365,7 @@ fn disconnect_all_inner( "All devices disconnected.", ); state::emit_state(app, &model.shared); - let state = model.snapshot(); - Ok(state) + model.snapshot() } #[tauri::command] @@ -937,9 +954,7 @@ async fn install_update(app: AppHandle) -> Result { let version = update.version().to_owned(); let downloaded_bytes = bytes.len() as u64; let total_bytes = model.snapshot().updater.total_bytes; - let overlay = app.state::(); - let modifier_overlay = app.state::(); - if let Err(error) = disconnect_all_inner(&app, &model, &overlay, &modifier_overlay) { + if let Err(error) = disconnect_all_on_main_thread(app.clone()).await { manager.store_download(bytes); manager.finish(UpdateOperation::Install); return Ok(update_failure(