use crossterm::event::KeyCode;
use super::input::is_mouse_sequence_fragment;
const TAIL_WINDOW: usize = 30;
#[derive(Debug, Default)]
pub(crate) struct MouseFragGate {
tail: String,
esc_key_pending: bool,
}
impl MouseFragGate {
pub(crate) fn absorb(&mut self, code: &KeyCode) -> bool {
match code {
KeyCode::Esc => {
self.esc_key_pending = true;
false
}
KeyCode::Char(c) => {
let dropped = if self.esc_key_pending {
self.esc_key_pending = false;
if *c == '[' {
self.tail.push('[');
true
} else {
is_mouse_sequence_fragment(*c, &self.tail, self.tail.len())
}
} else {
is_mouse_sequence_fragment(*c, &self.tail, self.tail.len())
};
if !dropped {
self.tail.push(*c);
if self.tail.len() > TAIL_WINDOW {
let mut cut = self.tail.len() - TAIL_WINDOW;
while !self.tail.is_char_boundary(cut) {
cut += 1;
}
self.tail.drain(..cut);
}
}
dropped
}
_ => {
self.esc_key_pending = false;
self.tail.clear();
false
}
}
}
}