use crossterm::event::Event;
use crossterm::event::KeyEvent;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum TerminalEvent {
Key(KeyEvent),
Paste(String),
Resize { width: u16, height: u16 },
FocusChanged(bool),
}
pub fn map_crossterm_event(event: Event) -> Option<TerminalEvent> {
match event {
Event::Key(key) => Some(TerminalEvent::Key(key)),
Event::Paste(text) => Some(TerminalEvent::Paste(text)),
Event::Resize(width, height) => Some(TerminalEvent::Resize { width, height }),
Event::FocusGained => Some(TerminalEvent::FocusChanged(true)),
Event::FocusLost => Some(TerminalEvent::FocusChanged(false)),
Event::Mouse(_) => None,
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TerminalState {
pub width: u16,
pub height: u16,
pub focused: bool,
}
impl TerminalState {
pub const fn new(width: u16, height: u16) -> Self {
Self {
width,
height,
focused: true,
}
}
pub fn apply(&mut self, event: &TerminalEvent) -> bool {
match event {
TerminalEvent::Resize { width, height } => {
let changed = self.width != *width || self.height != *height;
self.width = *width;
self.height = *height;
changed
}
TerminalEvent::FocusChanged(focused) => {
let changed = self.focused != *focused;
self.focused = *focused;
changed
}
TerminalEvent::Key(_) | TerminalEvent::Paste(_) => false,
}
}
}