diff options
Diffstat (limited to 'src/app/mod.rs')
| -rw-r--r-- | src/app/mod.rs | 30 |
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; |
