From 4401a7dbef3e1579af9694c5f6c38c1b788a86e2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 2 Feb 2024 08:44:28 -0700 Subject: [PATCH] Workaround for dead terminal event channel --- src/main.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index a7211ff..3fd74aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,6 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, env, process, sync::{atomic::Ordering, Mutex}, - time::Duration, }; use tokio::sync::mpsc; @@ -1343,7 +1342,33 @@ impl Application for App { } } Message::TermEventTx(term_event_tx) => { + // Check if the terminal event channel was reset + if self.term_event_tx_opt.is_some() { + // Close tabs using old terminal event channel + log::warn!("terminal event channel reset, closing tabs"); + + // First, close other panes + while let Some((_state, sibling)) = + self.pane_model.panes.close(self.pane_model.focus) + { + self.terminal_ids.remove(&self.pane_model.focus); + self.pane_model.focus = sibling; + } + + // Next, close all tabs in the active pane + if let Some(tab_model) = self.pane_model.active_mut() { + let entities: Vec<_> = tab_model.iter().collect(); + for entity in entities { + tab_model.remove(entity); + } + } + } + + // Set new terminal event channel self.term_event_tx_opt = Some(term_event_tx); + + // Spawn first tab + return self.update(Message::TabNew); } Message::ToggleContextPage(context_page) => { if self.context_page == context_page { @@ -1578,12 +1603,6 @@ impl Application for App { let (event_tx, mut event_rx) = mpsc::channel(100); output.send(Message::TermEventTx(event_tx)).await.unwrap(); - // Avoid creating two tabs at startup - tokio::time::sleep(Duration::from_millis(50)).await; - - // Create first terminal tab - output.send(Message::TabNew).await.unwrap(); - while let Some((pane, entity, event)) = event_rx.recv().await { output .send(Message::TermEvent(pane, entity, event))