use std::fmt::{Debug, Formatter, Result};
const MOD_SHIFT: u8 = 0b0000_0001;
const MOD_CTRL: u8 = 0b0000_0010;
const MOD_ALT: u8 = 0b0000_0100;
#[repr(transparent)]
#[derive(Copy, Clone, Default)]
pub struct Mod(u8);
impl Mod {
#[inline(always)]
pub fn none(self) -> bool {
self.0 == 0
}
#[inline(always)]
pub fn shift(self) -> bool {
(self.0 & MOD_SHIFT) != 0
}
#[inline(always)]
pub fn ctrl(self) -> bool {
(self.0 & MOD_CTRL) != 0
}
#[inline(always)]
pub fn alt(self) -> bool {
(self.0 & MOD_ALT) != 0
}
#[inline(always)]
pub fn new() -> Self {
Mod(0)
}
#[inline(always)]
pub fn add_shift(self) -> Self {
Self(self.0 | MOD_SHIFT)
}
#[inline(always)]
pub fn add_ctrl(self) -> Self {
Self(self.0 | MOD_CTRL)
}
#[inline(always)]
pub fn add_alt(self) -> Self {
Self(self.0 | MOD_ALT)
}
}
impl Debug for Mod {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
if self.ctrl() {
if self.alt() {
if self.shift() {
write!(f, "Ctrl + Alt + Shift")
} else {
write!(f, "Ctrl + Alt")
}
} else {
write!(f, "Ctrl")
}
} else if self.alt() {
if self.shift() {
write!(f, "Alt + Shift")
} else {
write!(f, "Alt")
}
} else if self.shift() {
write!(f, "Shift")
} else {
write!(f, "None")
}
}
}
#[repr(u8)]
#[derive(Debug, Copy, Clone)]
#[non_exhaustive]
pub enum Key {
Back = 0x00u8,
One = 0x01,
Two = 0x02,
Three = 0x03,
Four = 0x04,
Five = 0x05,
Six = 0x06,
Seven = 0x07,
Eight = 0x08,
Nine = 0x09,
Zero = 0x0A,
Minus = 0x0B,
Equal = 0x0C,
Backtick = 0x0D,
Tab = 0x0E,
Q = 0x0F,
W = 0x10,
E = 0x11,
R = 0x12,
T = 0x13,
Y = 0x14,
U = 0x15,
I = 0x16,
O = 0x17,
P = 0x18,
BracketOpen = 0x19,
BracketClose = 0x1A,
Backspace = 0x1B,
Env = 0x1C,
A = 0x1D,
S = 0x1E,
D = 0x1F,
F = 0x20,
G = 0x21,
H = 0x22,
J = 0x23,
K = 0x24,
L = 0x25,
Semicolon = 0x26,
Apostrophe = 0x27,
Enter = 0x28,
LShift = 0x29,
Z = 0x2A,
X = 0x2B,
C = 0x2C,
V = 0x2D,
B = 0x2E,
N = 0x2F,
M = 0x30,
Comma = 0x31,
Period = 0x32,
Slash = 0x33,
Backslash = 0x34,
Up = 0x35,
RShift = 0x36,
LCtrl = 0x37,
LAlt = 0x38,
Space = 0x39,
Compose = 0x3A,
RAlt = 0x3B,
RCtrl = 0x3C,
Left = 0x3D,
Down = 0x3E,
Right = 0x3F,
F1 = 0x41,
F2 = 0x42,
F3 = 0x43,
F4 = 0x44,
F5 = 0x45,
F6 = 0x46,
F7 = 0x47,
F8 = 0x48,
F9 = 0x49,
F10 = 0x4A,
F11 = 0x4B,
F12 = 0x4C,
Insert = 0x4D,
Delete = 0x5B,
CapsLock = 0x5C,
PageUp = 0x75,
Pause = 0x79,
Menu = 0x7C,
Home = 0x7D,
PageDown = 0x7E,
End = 0x7F,
}