From d5fe53ef5734e5a5e0f6f7808fd300937ac86d96 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Tue, 4 Jan 2022 11:07:09 +0100 Subject: [PATCH] fix(tabs): dont panic when tab history is empty and closing tab (#990) --- zellij-server/src/screen.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 4f9636ce..cfc99518 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -237,14 +237,27 @@ impl Screen { &mut self, client_ids_and_mode_infos: Vec<(ClientId, ModeInfo)>, ) { + // this will panic if there are no more tabs (ie. if self.tabs.is_empty() == true) for (client_id, client_mode_info) in client_ids_and_mode_infos { - let client_previous_tab = self.tab_history.get_mut(&client_id).unwrap().pop().unwrap(); - self.active_tab_indices - .insert(client_id, client_previous_tab); - self.tabs - .get_mut(&client_previous_tab) - .unwrap() - .add_client(client_id, Some(client_mode_info)); + let client_tab_history = self.tab_history.entry(client_id).or_insert_with(Vec::new); + match client_tab_history.pop() { + Some(client_previous_tab) => { + self.active_tab_indices + .insert(client_id, client_previous_tab); + self.tabs + .get_mut(&client_previous_tab) + .unwrap() + .add_client(client_id, Some(client_mode_info)); + } + None => { + let next_tab_index = *self.tabs.keys().next().unwrap(); + self.active_tab_indices.insert(client_id, next_tab_index); + self.tabs + .get_mut(&next_tab_index) + .unwrap() + .add_client(client_id, Some(client_mode_info)); + } + } } } fn move_clients_between_tabs(