use std::sync::OnceLock;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TerminalProtocol {
Sixel,
Kitty,
TextFallback,
}
static PROTOCOL: OnceLock<TerminalProtocol> = OnceLock::new();
pub fn init(p: TerminalProtocol) {
_ = PROTOCOL.set(p);
}
pub fn protocol() -> TerminalProtocol {
*PROTOCOL.get().unwrap_or(&TerminalProtocol::TextFallback)
}
pub fn protocol_name(p: TerminalProtocol) -> &'static str {
match p {
TerminalProtocol::Sixel => "sixel",
TerminalProtocol::Kitty => "kitty",
TerminalProtocol::TextFallback => "text-fallback",
}
}
pub fn detect() -> TerminalProtocol {
let term = std::env::var("TERM").unwrap_or_default();
if std::env::var("KITTY_WINDOW_ID").is_ok() || std::env::var("KITTY_PID").is_ok() {
return TerminalProtocol::Kitty;
}
if std::env::var("TERM_PROGRAM").as_deref().ok() == Some("Ghostty")
|| std::env::var("TERM_PROGRAM").as_deref().ok() == Some("vscode")
{
return TerminalProtocol::Kitty;
}
if term == "xterm-kitty" {
return TerminalProtocol::Kitty;
}
if std::env::var("WEZTERM_EXECUTABLE").is_ok() {
return TerminalProtocol::Kitty;
}
if term.contains("sixel") || term == "foot" || term == "contour" {
return TerminalProtocol::Sixel;
}
TerminalProtocol::TextFallback
}