diff options
author | Aram Drevekenin <aram@poor.dev> | 2022-10-10 15:10:21 +0200 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2022-10-10 15:10:21 +0200 |
commit | 82bca6dbb7e75864c7f4aa26b6570b723bb2392c (patch) | |
tree | ad5dcb85f9f3bcc75c81a49dbe00e12da64f24ea | |
parent | eea48f790003f517000364d5fced434b1381b784 (diff) |
reap terminal_ids from os_input_output on pane close
-rw-r--r-- | zellij-server/src/os_input_output.rs | 4 | ||||
-rw-r--r-- | zellij-server/src/pty.rs | 24 | ||||
-rw-r--r-- | zellij-server/src/ui/pane_boundaries_frame.rs | 4 |
3 files changed, 20 insertions, 12 deletions
diff --git a/zellij-server/src/os_input_output.rs b/zellij-server/src/os_input_output.rs index 6079910bb..1d212b7a7 100644 --- a/zellij-server/src/os_input_output.rs +++ b/zellij-server/src/os_input_output.rs @@ -410,6 +410,7 @@ pub trait ServerOsApi: Send + Sync { run_command: RunCommand, quit_cb: Box<dyn Fn(PaneId, Option<i32>, RunCommand) + Send>, // u32 is the exit status ) -> Result<(RawFd, RawFd), SpawnTerminalError>; + fn clear_terminal_id(&self, terminal_id: u32); } impl ServerOsApi for ServerOsInputOutput { @@ -581,6 +582,9 @@ impl ServerOsApi for ServerOsInputOutput { Err(e) => Err(e) } } + fn clear_terminal_id(&self, terminal_id: u32) { + self.terminal_id_to_raw_fd.lock().unwrap().remove(&terminal_id); + } } impl Clone for Box<dyn ServerOsApi> { diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 30a68a63c..fc8aaf9fa 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -112,6 +112,8 @@ pub(crate) fn pty_thread_main(mut pty: Pty, layout: Box<Layout>) { pty.bus.senders .send_to_screen(ScreenInstruction::HoldPane(PaneId::Terminal(pid), Some(2), run_command, None)).unwrap(); } + } else { + pty.close_pane(PaneId::Terminal(pid)); } }, Err(e) => { @@ -462,16 +464,18 @@ impl Pty { pub fn close_pane(&mut self, id: PaneId) { match id { PaneId::Terminal(id) => { - let child_fd = self.id_to_child_pid.remove(&id).unwrap(); - self.task_handles.remove(&id).unwrap(); - task::block_on(async { - self.bus - .os_input - .as_mut() - .unwrap() - .kill(Pid::from_raw(child_fd)) - .unwrap(); - }); + self.task_handles.remove(&id); + if let Some(child_fd) = self.id_to_child_pid.remove(&id) { + task::block_on(async { + self.bus + .os_input + .as_mut() + .unwrap() + .kill(Pid::from_raw(child_fd)) + .unwrap(); + }); + } + self.bus.os_input.as_ref().unwrap().clear_terminal_id(id); }, PaneId::Plugin(pid) => drop( self.bus diff --git a/zellij-server/src/ui/pane_boundaries_frame.rs b/zellij-server/src/ui/pane_boundaries_frame.rs index f4461cb03..882c0a0d0 100644 --- a/zellij-server/src/ui/pane_boundaries_frame.rs +++ b/zellij-server/src/ui/pane_boundaries_frame.rs @@ -780,9 +780,9 @@ impl PaneFrame { } fn empty_undertitle(&self, max_undertitle_length: usize) -> Vec<TerminalCharacter> { let mut left_boundary = - foreground_color(self.get_corner(boundary_type::TOP_LEFT), self.color); + foreground_color(self.get_corner(boundary_type::BOTTOM_LEFT), self.color); let mut right_boundary = - foreground_color(self.get_corner(boundary_type::TOP_RIGHT), self.color); + foreground_color(self.get_corner(boundary_type::BOTTOM_RIGHT), self.color); let mut ret = vec![]; let mut padding = String::new(); for _ in 0..max_undertitle_length { |