diff options
| author | Aram Drevekenin <aram@poor.dev> | 2021-04-06 16:55:32 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-06 16:55:32 +0200 |
| commit | e551bec538fcfe709239fcbc6fc2678335729b8c (patch) | |
| tree | 0c9a591ee9a67f94222fdc14c501c8f825832cf3 /src | |
| parent | fix(terminal): support bright colors (#256) (diff) | |
| download | sl0ppij-e551bec538fcfe709239fcbc6fc2678335729b8c.tar.gz sl0ppij-e551bec538fcfe709239fcbc6fc2678335729b8c.tar.xz sl0ppij-e551bec538fcfe709239fcbc6fc2678335729b8c.zip | |
fix(screen): handle events directed at other tabs (#257)
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/tab.rs | 3 | ||||
| -rw-r--r-- | 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<dyn OsApi>, 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(); |
