use std::io::{self, stdout};
use bevy::prelude::*;
use crossterm::{
event::{KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags},
terminal::supports_keyboard_enhancement,
ExecutableCommand,
};
use crate::terminal;
pub struct KittyPlugin;
impl Plugin for KittyPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, setup.after(terminal::setup));
}
}
fn setup(mut commands: Commands) {
if enable_kitty_protocol().is_ok() {
commands.insert_resource(KittyEnabled);
}
}
#[derive(Resource)]
pub struct KittyEnabled;
impl Drop for KittyEnabled {
fn drop(&mut self) {
let _ = disable_kitty_protocol();
}
}
pub fn enable_kitty_protocol() -> io::Result<()> {
if supports_keyboard_enhancement()? {
stdout().execute(PushKeyboardEnhancementFlags(KeyboardEnhancementFlags::all()))?;
return Ok(());
}
Err(io::Error::new(
io::ErrorKind::Unsupported,
"Kitty keyboard protocol is not supported by this terminal.",
))
}
pub fn disable_kitty_protocol() -> io::Result<()> {
stdout().execute(PopKeyboardEnhancementFlags)?;
Ok(())
}