use std::io::{Write, stdout};
fn set_title_escape(title: &str) -> String {
format!("\x1b]0;{}\x07", title)
}
fn restore_title_escape() -> &'static str {
"\x1b]0;\x07"
}
pub fn set_window_title(title: &str) {
let mut stdout = stdout();
let _ = write!(stdout, "{}", set_title_escape(title));
let _ = stdout.flush();
}
pub fn clear_window_title() {
set_window_title("");
}
pub struct WindowTitleGuard {
original_title: Option<String>,
}
impl WindowTitleGuard {
pub fn new(original_title: Option<String>) -> Self {
Self { original_title }
}
}
impl Drop for WindowTitleGuard {
fn drop(&mut self) {
if let Some(ref title) = self.original_title {
set_window_title(title);
} else {
let mut stdout = stdout();
let _ = write!(stdout, "{}", restore_title_escape());
let _ = stdout.flush();
}
}
}
pub fn use_window_title(title: &str) {
set_window_title(title);
}
pub fn use_window_title_fn<F>(f: F)
where
F: FnOnce() -> String,
{
set_window_title(&f());
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_title_escape_sequence() {
let escape = set_title_escape("Test Title");
assert_eq!(escape, "\x1b]0;Test Title\x07");
}
#[test]
fn test_empty_title() {
let escape = set_title_escape("");
assert_eq!(escape, "\x1b]0;\x07");
}
#[test]
fn test_title_with_special_chars() {
let escape = set_title_escape("My App - [1/10]");
assert_eq!(escape, "\x1b]0;My App - [1/10]\x07");
}
}