diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index feed3d510f78c30a1b32fc57c3a6162b5f9c4816..0eefc8939a35682acae1c21487a95f42c9a0d13d 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -32,6 +32,7 @@ use mappings::mouse::{ use procinfo::LocalProcessInfo; use settings::{AlternateScroll, Settings, Shell, TerminalBlink}; +use util::truncate_and_trailoff; use std::{ cmp::min, @@ -1169,6 +1170,38 @@ impl Terminal { all_search_matches(&term, &searcher).collect() }) } + + pub fn title(&self) -> String { + self.foreground_process_info + .as_ref() + .map(|fpi| { + format!( + "{} — {}", + truncate_and_trailoff( + &fpi.cwd + .file_name() + .map(|name| name.to_string_lossy().to_string()) + .unwrap_or_default(), + 25 + ), + truncate_and_trailoff( + &{ + format!( + "{}{}", + fpi.name, + if fpi.argv.len() >= 1 { + format!(" {}", (&fpi.argv[1..]).join(" ")) + } else { + "".to_string() + } + ) + }, + 25 + ) + ) + }) + .unwrap_or_else(|| "Terminal".to_string()) + } } impl Drop for Terminal { diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 3821185ec02e9d1981162863efa1a1708c9e3f97..302186d8c769433a3a56583a663da3c7de3d85f9 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -30,7 +30,7 @@ use terminal::{ }, Event, Terminal, }; -use util::{truncate_and_trailoff, ResultExt}; +use util::ResultExt; use workspace::{ item::{Item, ItemEvent}, notifications::NotifyResultExt, @@ -547,38 +547,7 @@ impl Item for TerminalView { tab_theme: &theme::Tab, cx: &gpui::AppContext, ) -> ElementBox { - let title = self - .terminal() - .read(cx) - .foreground_process_info - .as_ref() - .map(|fpi| { - format!( - "{} — {}", - truncate_and_trailoff( - &fpi.cwd - .file_name() - .map(|name| name.to_string_lossy().to_string()) - .unwrap_or_default(), - 25 - ), - truncate_and_trailoff( - &{ - format!( - "{}{}", - fpi.name, - if fpi.argv.len() >= 1 { - format!(" {}", (&fpi.argv[1..]).join(" ")) - } else { - "".to_string() - } - ) - }, - 25 - ) - ) - }) - .unwrap_or_else(|| "Terminal".to_string()); + let title = self.terminal().read(cx).title(); Flex::row() .with_child( diff --git a/crates/workspace/src/terminal_button.rs b/crates/workspace/src/terminal_button.rs index 4789152327657ad9dc169d3801f9ee8658a0b735..0e21f51341c5622fe5d7c806fabfa9591b2c373e 100644 --- a/crates/workspace/src/terminal_button.rs +++ b/crates/workspace/src/terminal_button.rs @@ -120,10 +120,11 @@ impl TerminalButton { let local_terminal_handles = project.local_terminal_handles(); for local_terminal_handle in local_terminal_handles { - if let Some(_) = local_terminal_handle.upgrade(cx) { - // TODO: Obtain the actual terminal "name" and put it in the menu + if let Some(terminal) = local_terminal_handle.upgrade(cx) { + let title = terminal.read(cx).title(); + // TODO: Replace the `NewTerminal` action with an action that instead focuses the selected terminal - menu_options.push(ContextMenuItem::item("Terminal", NewTerminal)) + menu_options.push(ContextMenuItem::item(title, NewTerminal)) } } }