use crossterm::{event, execute};
#[derive(Default)]
pub(crate) struct KittyProtocolGuard {
enabled: bool,
active: bool,
support_kitty_protocol: Option<bool>,
}
impl KittyProtocolGuard {
pub fn set(&mut self, enable: bool) {
if enable && self.support_kitty_protocol.is_none() {
self.support_kitty_protocol = Some(super::kitty_protocol_available());
}
self.enabled = enable && self.support_kitty_protocol.unwrap_or(false);
}
pub fn enter(&mut self) {
if self.enabled && !self.active {
let _ = execute!(
std::io::stdout(),
event::PushKeyboardEnhancementFlags(
event::KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
)
);
self.active = true;
}
}
pub fn exit(&mut self) {
if self.active {
let _ = execute!(std::io::stdout(), event::PopKeyboardEnhancementFlags);
self.active = false;
}
}
}
impl Drop for KittyProtocolGuard {
fn drop(&mut self) {
if self.active {
let _ = execute!(std::io::stdout(), event::PopKeyboardEnhancementFlags);
}
}
}