use crate::app::window_state::WindowState;
impl WindowState {
pub(crate) fn update_window_title_with_shell_integration(&self) {
let tab = if let Some(t) = self.tab_manager.active_tab() {
t
} else {
return;
};
if tab.active_scroll_state().offset != 0 {
return;
}
if tab.active_mouse().hovered_url.is_some() {
return;
}
let window = if let Some(w) = &self.window {
w
} else {
return;
};
if let Ok(term) = tab.terminal.try_write() {
let mut title_parts = vec![self.config.window_title.clone()];
if self.config.show_window_number {
title_parts.push(format!("[{}]", self.window_index));
}
if let Some(cwd) = term.shell_integration_cwd() {
let abbreviated_cwd = if let Some(home) = dirs::home_dir() {
cwd.replace(&home.to_string_lossy().to_string(), "~")
} else {
cwd
};
title_parts.push(format!("({})", abbreviated_cwd));
}
if let Some(cmd_name) = term.get_running_command_name() {
title_parts.push(format!("[{}]", cmd_name));
}
if let Some(exit_code) = term.shell_integration_exit_code()
&& exit_code != 0
{
title_parts.push(format!("[Exit: {}]", exit_code));
}
if self.is_recording {
title_parts.push("[RECORDING]".to_string());
}
let title = title_parts.join(" ");
window.set_title(&title);
}
}
pub(crate) fn sync_badge_shell_integration(&mut self) {
let tab = if let Some(t) = self.tab_manager.active_tab() {
t
} else {
return;
};
if let Ok(term) = tab.terminal.try_write() {
let exit_code = term.shell_integration_exit_code();
let current_command = term.get_running_command_name();
let cwd = term.shell_integration_cwd();
let hostname = term.shell_integration_hostname();
let username = term.shell_integration_username();
let mut vars = self.badge_state.variables_mut();
let mut badge_changed = false;
if vars.exit_code != exit_code {
vars.set_exit_code(exit_code);
badge_changed = true;
}
if vars.current_command != current_command {
vars.set_current_command(current_command);
badge_changed = true;
}
if let Some(cwd) = cwd
&& vars.path != cwd
{
vars.set_path(cwd);
badge_changed = true;
}
if let Some(ref host) = hostname
&& vars.hostname != *host
{
vars.hostname = host.clone();
badge_changed = true;
} else if hostname.is_none() && !vars.hostname.is_empty() {
}
if let Some(ref user) = username
&& vars.username != *user
{
vars.username = user.clone();
badge_changed = true;
}
drop(vars);
if badge_changed {
self.badge_state.mark_dirty();
}
}
}
}