From e551bec538fcfe709239fcbc6fc2678335729b8c Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Tue, 6 Apr 2021 16:55:32 +0200 Subject: [PATCH] fix(screen): handle events directed at other tabs (#257) --- src/client/tab.rs | 3 +++ src/common/mod.rs | 20 ++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/client/tab.rs b/src/client/tab.rs index 9e2b370f..db109480 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -561,6 +561,9 @@ impl Tab { None } } + pub fn has_terminal_pid(&self, pid: RawFd) -> bool { + self.panes.contains_key(&PaneId::Terminal(pid)) + } pub fn handle_pty_event(&mut self, pid: RawFd, event: VteEvent) { // if we don't have the terminal in self.terminals it's probably because // of a race condition where the terminal was created in pty_bus but has not diff --git a/src/common/mod.rs b/src/common/mod.rs index e9b74d58..8180a724 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -276,10 +276,22 @@ pub fn start(mut os_input: Box, opts: CliArgs) { screen.send_pty_instructions.update(err_ctx); match event { ScreenInstruction::Pty(pid, vte_event) => { - screen - .get_active_tab_mut() - .unwrap() - .handle_pty_event(pid, vte_event); + let active_tab = screen.get_active_tab_mut().unwrap(); + if active_tab.has_terminal_pid(pid) { + // it's most likely that this event is directed at the active tab + // look there first + active_tab.handle_pty_event(pid, vte_event); + } else { + // if this event wasn't directed at the active tab, start looking + // in other tabs + let all_tabs = screen.get_tabs_mut(); + for tab in all_tabs.values_mut() { + if tab.has_terminal_pid(pid) { + tab.handle_pty_event(pid, vte_event); + break; + } + } + } } ScreenInstruction::Render => { screen.render();