use crate::{_impl_init, EventKind, EventMouse, EventWheel, EventWindow, Key, Position2};
crate::test_size_of!(TermInputState = 18 | 144);
#[derive(Clone, Debug, Default)]
pub(crate) enum TermInputState {
#[default]
Ground,
Esc,
Ss3,
Csi { buf: [u8; 16], len: u8 },
Utf8 { buf: [u8; 4], len: u8, need: u8 },
}
_impl_init! { Self::Ground => TermInputState }
#[cfg(not(feature = "alloc"))]
crate::test_size_of!(TermParsed = 36 | 288);
#[cfg(feature = "alloc")]
crate::test_size_of!(TermParsed = 40 | 320);
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) enum TermParsed {
Event(EventKind),
Reply(TermReply),
Pending,
Unknown,
}
crate::test_size_of!(TermParsedCsi = 20 | 160);
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum TermParsedCsi {
Continue,
Pending,
Key(Key),
Mouse(EventMouse),
Wheel(EventWheel),
FocusGained,
FocusLost,
Reply(TermReply),
Unknown,
}
impl TermParsedCsi {
pub(super) const fn to_term_parsed(self) -> TermParsed {
match self {
TermParsedCsi::Continue => TermParsed::Unknown,
TermParsedCsi::Pending => TermParsed::Pending,
TermParsedCsi::Key(key) => TermParsed::Event(super::TermInputParser::key(key)),
TermParsedCsi::Mouse(mouse) => TermParsed::Event(EventKind::Mouse(mouse)),
TermParsedCsi::Wheel(wheel) => TermParsed::Event(EventKind::Wheel(wheel)),
TermParsedCsi::FocusGained => {
TermParsed::Event(EventKind::Window(EventWindow::FocusGained))
}
TermParsedCsi::FocusLost => {
TermParsed::Event(EventKind::Window(EventWindow::FocusLost))
}
TermParsedCsi::Reply(reply) => TermParsed::Reply(reply),
TermParsedCsi::Unknown => TermParsed::Unknown,
}
}
}
crate::test_size_of!(TermReply = 6 | 48);
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum TermReply {
CursorPosition(Position2<u16>),
DeviceAttributes,
DecPrivateMode { mode: u16, status: TermDecModeStatus },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u8)]
pub(crate) enum TermDecModeStatus {
NotRecognized = 0,
Set = 1,
Reset = 2,
PermanentlySet = 3,
PermanentlyReset = 4,
}
impl TermDecModeStatus {
pub(crate) const fn from_u16(value: u16) -> Option<Self> {
match value {
0 => Some(Self::NotRecognized),
1 => Some(Self::Set),
2 => Some(Self::Reset),
3 => Some(Self::PermanentlySet),
4 => Some(Self::PermanentlyReset),
_ => None,
}
}
pub(crate) const fn is_supported(self) -> bool {
!matches!(self, Self::NotRecognized)
}
}