diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 53318d943f..f7d3032eab 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -2360,7 +2360,12 @@ impl Workspace { } fn on_window_activation_changed(&mut self, active: bool, cx: &mut ViewContext) { - if !active && cx.global::().autosave == Autosave::OnWindowChange { + if !active + && matches!( + cx.global::().autosave, + Autosave::OnWindowChange | Autosave::OnFocusChange + ) + { for pane in &self.panes { pane.update(cx, |pane, cx| { for item in pane.items() { @@ -3073,6 +3078,17 @@ mod tests { deterministic.run_until_parked(); item.read_with(cx, |item, _| assert_eq!(item.save_count, 2)); + // Deactivating the window still saves the file. + cx.simulate_window_activation(Some(window_id)); + item.update(cx, |item, cx| { + cx.focus_self(); + item.is_dirty = true; + }); + cx.simulate_window_activation(None); + + deterministic.run_until_parked(); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 3)); + // Autosave after delay. item.update(cx, |item, cx| { cx.update_global(|settings: &mut Settings, _| { @@ -3084,11 +3100,11 @@ mod tests { // Delay hasn't fully expired, so the file is still dirty and unsaved. deterministic.advance_clock(Duration::from_millis(250)); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 2)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 3)); // After delay expires, the file is saved. deterministic.advance_clock(Duration::from_millis(250)); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 3)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); // Autosave on focus change, ensuring closing the tab counts as such. item.update(cx, |item, cx| { @@ -3106,7 +3122,7 @@ mod tests { .await .unwrap(); assert!(!cx.has_pending_prompt(window_id)); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); // Add the item again, ensuring autosave is prevented if the underlying file has been deleted. workspace.update(cx, |workspace, cx| { @@ -3118,7 +3134,7 @@ mod tests { cx.blur(); }); deterministic.run_until_parked(); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); // Ensure autosave is prevented for deleted files also when closing the buffer. let _close_items = workspace.update(cx, |workspace, cx| { @@ -3127,7 +3143,7 @@ mod tests { }); deterministic.run_until_parked(); assert!(cx.has_pending_prompt(window_id)); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); } #[derive(Clone)]