use super::constants::*;
use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent};
use smallvec::SmallVec;
pub fn handle_input_event(event: Event) -> Option<SmallVec<[u8; 8]>> {
match event {
Event::Key(key_event) => {
if key_event.kind != KeyEventKind::Press {
return None;
}
key_event_to_bytes(key_event)
}
Event::Mouse(mouse_event) => {
mouse_event_to_bytes(mouse_event)
}
Event::Resize(_width, _height) => {
None
}
_ => None,
}
}
pub fn key_event_to_bytes(key_event: KeyEvent) -> Option<SmallVec<[u8; 8]>> {
match key_event {
KeyEvent {
code: KeyCode::Char(c),
modifiers: KeyModifiers::CONTROL,
..
} => {
match c {
'c' | 'C' => Some(SmallVec::from_slice(CTRL_C_SEQUENCE)), 'd' | 'D' => Some(SmallVec::from_slice(CTRL_D_SEQUENCE)), 'z' | 'Z' => Some(SmallVec::from_slice(CTRL_Z_SEQUENCE)), 'a' | 'A' => Some(SmallVec::from_slice(CTRL_A_SEQUENCE)), 'e' | 'E' => Some(SmallVec::from_slice(CTRL_E_SEQUENCE)), 'u' | 'U' => Some(SmallVec::from_slice(CTRL_U_SEQUENCE)), 'k' | 'K' => Some(SmallVec::from_slice(CTRL_K_SEQUENCE)), 'w' | 'W' => Some(SmallVec::from_slice(CTRL_W_SEQUENCE)), 'l' | 'L' => Some(SmallVec::from_slice(CTRL_L_SEQUENCE)), 'r' | 'R' => Some(SmallVec::from_slice(CTRL_R_SEQUENCE)), _ => {
let byte = (c.to_ascii_lowercase() as u8).saturating_sub(b'a' - 1);
if byte <= 26 {
Some(SmallVec::from_slice(&[byte]))
} else {
None
}
}
}
}
KeyEvent {
code: KeyCode::Char(c),
modifiers,
..
} if !modifiers
.intersects(KeyModifiers::CONTROL | KeyModifiers::ALT | KeyModifiers::META) =>
{
let bytes = c.to_string().into_bytes();
Some(SmallVec::from_slice(&bytes))
}
KeyEvent {
code: KeyCode::Enter,
..
} => Some(SmallVec::from_slice(ENTER_SEQUENCE)),
KeyEvent {
code: KeyCode::Tab, ..
} => Some(SmallVec::from_slice(TAB_SEQUENCE)),
KeyEvent {
code: KeyCode::Backspace,
..
} => Some(SmallVec::from_slice(BACKSPACE_SEQUENCE)),
KeyEvent {
code: KeyCode::Esc, ..
} => Some(SmallVec::from_slice(ESC_SEQUENCE)),
KeyEvent {
code: KeyCode::Up, ..
} => Some(SmallVec::from_slice(UP_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Down,
..
} => Some(SmallVec::from_slice(DOWN_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Right,
..
} => Some(SmallVec::from_slice(RIGHT_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Left,
..
} => Some(SmallVec::from_slice(LEFT_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::F(n),
..
} => {
match n {
1 => Some(SmallVec::from_slice(F1_SEQUENCE)), 2 => Some(SmallVec::from_slice(F2_SEQUENCE)), 3 => Some(SmallVec::from_slice(F3_SEQUENCE)), 4 => Some(SmallVec::from_slice(F4_SEQUENCE)), 5 => Some(SmallVec::from_slice(F5_SEQUENCE)), 6 => Some(SmallVec::from_slice(F6_SEQUENCE)), 7 => Some(SmallVec::from_slice(F7_SEQUENCE)), 8 => Some(SmallVec::from_slice(F8_SEQUENCE)), 9 => Some(SmallVec::from_slice(F9_SEQUENCE)), 10 => Some(SmallVec::from_slice(F10_SEQUENCE)), 11 => Some(SmallVec::from_slice(F11_SEQUENCE)), 12 => Some(SmallVec::from_slice(F12_SEQUENCE)), _ => None, }
}
KeyEvent {
code: KeyCode::Home,
..
} => Some(SmallVec::from_slice(HOME_SEQUENCE)),
KeyEvent {
code: KeyCode::End, ..
} => Some(SmallVec::from_slice(END_SEQUENCE)),
KeyEvent {
code: KeyCode::PageUp,
..
} => Some(SmallVec::from_slice(PAGE_UP_SEQUENCE)),
KeyEvent {
code: KeyCode::PageDown,
..
} => Some(SmallVec::from_slice(PAGE_DOWN_SEQUENCE)),
KeyEvent {
code: KeyCode::Insert,
..
} => Some(SmallVec::from_slice(INSERT_SEQUENCE)),
KeyEvent {
code: KeyCode::Delete,
..
} => Some(SmallVec::from_slice(DELETE_SEQUENCE)),
_ => None,
}
}
pub fn mouse_event_to_bytes(_mouse_event: MouseEvent) -> Option<SmallVec<[u8; 8]>> {
None
}