From 3c28282108caed3bb88bfde1da7ce1a7591500eb Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Wed, 13 Mar 2024 10:15:22 +0100 Subject: [PATCH] Redraw when toggling between windows (#9236) Before this change we didn't consistently trigger focus events when toggling between with windows `Cmd-backtick`. We only triggered them when the OS decided to trigger a redraw. That lead to a nasty bug that showed up in Vim mode where a cursor would still be active in the hidden window, even though it was deactivated. One then had to manually try to trigger a focus event in the new window to activate the cursor. With this change, we call `cx.refresh` when the window activation status changed which triggers focus events consistently and fixes this bug. With logging we can observe this: **BEFORE**: https://github.com/zed-industries/zed/assets/1185253/e1ad8878-129c-44ba-9d8b-c720f9dca5b6 **AFTER**: https://github.com/zed-industries/zed/assets/1185253/733fdadb-d1ea-47fe-a2c1-7b50af299cc0 Release Notes: - Fixed focus not being consistently changed when switching between multiple Zed windows via `Cmd-backtick`. --------- Co-authored-by: Manu Raj Co-authored-by: Antonio --- crates/gpui/src/window.rs | 1 + crates/workspace/src/workspace.rs | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 60cab84125..23b01c9462 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -468,6 +468,7 @@ impl Window { .activation_observers .clone() .retain(&(), |callback| callback(cx)); + cx.refresh(); }) .log_err(); } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 8198cab533..45e98e4430 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -5207,6 +5207,11 @@ mod tests { cx.deactivate_window(); item.update(cx, |item, _| assert_eq!(item.save_count, 1)); + // Re-activating the window doesn't save the file. + cx.update(|cx| cx.activate_window()); + cx.executor().run_until_parked(); + item.update(cx, |item, _| assert_eq!(item.save_count, 1)); + // Autosave on focus change. item.update(cx, |item, cx| { cx.focus_self(); @@ -5224,13 +5229,11 @@ mod tests { item.update(cx, |item, _| assert_eq!(item.save_count, 2)); // Deactivating the window still saves the file. - cx.update(|cx| cx.activate_window()); item.update(cx, |item, cx| { cx.focus_self(); item.is_dirty = true; }); cx.deactivate_window(); - item.update(cx, |item, _| assert_eq!(item.save_count, 3)); // Autosave after delay.