summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2022-10-10 15:10:21 +0200
committerAram Drevekenin <aram@poor.dev>2022-10-10 15:10:21 +0200
commit82bca6dbb7e75864c7f4aa26b6570b723bb2392c (patch)
treead5dcb85f9f3bcc75c81a49dbe00e12da64f24ea
parenteea48f790003f517000364d5fced434b1381b784 (diff)
reap terminal_ids from os_input_output on pane close
-rw-r--r--zellij-server/src/os_input_output.rs4
-rw-r--r--zellij-server/src/pty.rs24
-rw-r--r--zellij-server/src/ui/pane_boundaries_frame.rs4
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 {