From b5006b303e6005246d76e729cd857f70fb238985 Mon Sep 17 00:00:00 2001 From: tidely <43219534+tidely@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:17:01 +0200 Subject: [PATCH 1/4] Don't clone whole tab group eagerly --- crates/gpui/src/app.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index d4bd7798187a5b..4d828a8eeac97a 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -421,7 +421,7 @@ impl SystemWindowTabController { /// Insert a tab into a tab group. pub fn add_tab(cx: &mut App, id: WindowId, tabs: Vec) { let mut controller = cx.global_mut::(); - let Some(tab) = tabs.clone().into_iter().find(|tab| tab.id == id) else { + let Some(tab) = tabs.iter().find(|tab| tab.id == id).cloned() else { return; }; From 913062e022f1bd6204c8cb34c90fedc21185a884 Mon Sep 17 00:00:00 2001 From: tidely <43219534+tidely@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:18:20 +0200 Subject: [PATCH 2/4] Drain & extend instead of clone & clear --- crates/gpui/src/app.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 4d828a8eeac97a..e719b1814eb63e 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -484,16 +484,14 @@ impl SystemWindowTabController { return; }; + let initial_tabs_len = initial_tabs.len(); let mut all_tabs = initial_tabs.clone(); - for tabs in controller.tab_groups.values() { - all_tabs.extend( - tabs.iter() - .filter(|tab| !initial_tabs.contains(tab)) - .cloned(), - ); + + for (_, mut tabs) in controller.tab_groups.drain() { + tabs.retain(|tab| !all_tabs[..initial_tabs_len].contains(tab)); + all_tabs.extend(tabs); } - controller.tab_groups.clear(); controller.tab_groups.insert(0, all_tabs); } From 548243fa11471286f8d1cca2095c21891c0dbbe3 Mon Sep 17 00:00:00 2001 From: tidely <43219534+tidely@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:20:12 +0200 Subject: [PATCH 3/4] Remove unnecessary hashmap lookup We unnecessarily looked for the group id and then looked it up in the hashmap, when we could iterate through the group right away --- crates/gpui/src/app.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index e719b1814eb63e..632f0c3a049501 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -341,12 +341,9 @@ impl SystemWindowTabController { /// Get all tabs in the same window. pub fn tabs(&self, id: WindowId) -> Option<&Vec> { - let tab_group = self - .tab_groups - .iter() - .find_map(|(group, tabs)| tabs.iter().find(|tab| tab.id == id).map(|_| *group))?; - - self.tab_groups.get(&tab_group) + self.tab_groups + .values() + .find(|tabs| tabs.iter().any(|tab| tab.id == id)) } /// Initialize the visibility of the system window tab controller. From 71d0391aaf85ff2620d5772428ab367c12f92016 Mon Sep 17 00:00:00 2001 From: tidely <43219534+tidely@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:20:40 +0200 Subject: [PATCH 4/4] Add todo --- crates/gpui/src/app.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 632f0c3a049501..6e91454d9b4011 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -296,6 +296,7 @@ impl SystemWindowTabController { .find_map(|(group, tabs)| tabs.iter().find(|tab| tab.id == id).map(|_| group)); let current_group = current_group?; + // TODO: `.keys()` returns arbitrary order, what does "next" mean? let mut group_ids: Vec<_> = controller.tab_groups.keys().collect(); let idx = group_ids.iter().position(|g| *g == current_group)?; let next_idx = (idx + 1) % group_ids.len(); @@ -320,6 +321,7 @@ impl SystemWindowTabController { .find_map(|(group, tabs)| tabs.iter().find(|tab| tab.id == id).map(|_| group)); let current_group = current_group?; + // TODO: `.keys()` returns arbitrary order, what does "previous" mean? let mut group_ids: Vec<_> = controller.tab_groups.keys().collect(); let idx = group_ids.iter().position(|g| *g == current_group)?; let prev_idx = if idx == 0 {