aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/mod.rs')
-rw-r--r--src/app/mod.rs30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs
index cca530ce..d3d79954 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -26,6 +26,7 @@ mod tab_bar_status;
mod terminal_targets;
mod terminal_titles;
mod theme_sync;
+mod window_title;
mod worktrees;
use std::collections::{HashMap, HashSet};
@@ -144,6 +145,8 @@ pub struct App {
tab_bar_datetimes: Vec<tab_bar_status::TabBarDatetimeRuntime>,
tab_bar_commands: Vec<tab_bar_status::TabBarCommandRuntime>,
next_tab_bar_datetime_refresh: Option<Instant>,
+ /// Parsed `ui.window_title` plus the hostname resolved when it was applied.
+ window_title_template: Option<(crate::config::WindowTitleTemplate, String)>,
pub(crate) persist_pane_history: bool,
pub(crate) last_render_at: Option<Instant>,
pub(crate) input_leases: input::InputLeaseTable,
@@ -773,6 +776,7 @@ impl App {
tab_bar_datetimes: Vec::new(),
tab_bar_commands: Vec::new(),
next_tab_bar_datetime_refresh: None,
+ window_title_template: None,
selection_autoscroll_deadline: None,
selection_highlight_clear_deadline: None,
persist_pane_history: config.experimental.pane_history,
@@ -794,6 +798,7 @@ impl App {
prefix_input_source: Box::new(crate::platform::RealPrefixInputSource::default()),
};
app.configure_tab_bar_status(&config.ui.tab_bar_right, &config.ui.tab_bar_right_separator);
+ app.configure_window_title(&config.ui.window_title);
app
}
@@ -928,6 +933,7 @@ impl App {
self.query_host_terminal_theme();
let mut needs_render = true;
+ let mut sent_window_title: Option<Option<String>> = None;
let mut host_mouse_capture_active = self.state.mouse_capture;
let mut host_keyboard_report_all_active = false;
@@ -936,11 +942,6 @@ impl App {
if self.render_dirty.is_pending() {
needs_render = true;
}
- let terminal_title_changed = self.sync_terminal_titles();
- if terminal_title_changed && self.terminal_title_sidebar_configured() {
- needs_render = true;
- }
-
// Drain a bounded internal-event batch for responsiveness. API handlers
// perform an exhaustive drain before reading pane/runtime state.
if self.drain_internal_events() {
@@ -1062,7 +1063,20 @@ impl App {
self.sync_host_keyboard_report_all(&mut host_keyboard_report_all_active)?;
if needs_render && self.can_render_now(now) {
- let _ = self.render_dirty.take();
+ let render_request = self.render_dirty.take();
+ self.sync_terminal_titles(&render_request.terminal_title_sources);
+ if self.window_title_configured() {
+ let title = self
+ .window_title()
+ .and_then(|title| crate::config::sanitize_window_title_text(&title));
+ if sent_window_title.as_ref() != Some(&title) {
+ crate::terminal_effects::write_window_title(
+ &mut std::io::stdout(),
+ title.as_deref(),
+ )?;
+ sent_window_title = Some(title);
+ }
+ }
let _sync_output = SyncOutputGuard::begin()?;
let kitty_graphics_enabled = self.state.kitty_graphics_enabled;
if self.full_redraw_pending {
@@ -1437,6 +1451,9 @@ impl App {
diagnostics.extend(crate::config::tab_bar_right_diagnostics(
&config.ui.tab_bar_right,
));
+ diagnostics.extend(crate::config::window_title_diagnostics(
+ &config.ui.window_title,
+ ));
self.state.default_sidebar_width = config.ui.sidebar_width;
if self.state.sidebar_width_source == state::SidebarWidthSource::ConfigDefault {
@@ -1480,6 +1497,7 @@ impl App {
&config.ui.tab_bar_right,
&config.ui.tab_bar_right_separator,
);
+ self.configure_window_title(&config.ui.window_title);
self.state.agent_panel_sort =
agent_panel_sort_from_config(config.ui.agent_panel_sort);
self.state.status_indicators = config.ui.status_indicators;