use super::kbd::{KbdMap, Key};
#[derive(
Clone,
Copy,
Debug,
Default,
Eq,
Ord,
PartialEq,
PartialOrd,
num_enum::IntoPrimitive,
num_enum::FromPrimitive,
)]
#[repr(u8)]
#[non_exhaustive]
pub enum KeyUsage {
#[default]
KeyNone = 0x00,
KeyA = 0x04,
KeyB = 0x05,
KeyC = 0x06,
KeyD = 0x07,
KeyE = 0x08,
KeyF = 0x09,
KeyG = 0x0A,
KeyH = 0x0B,
KeyI = 0x0C,
KeyJ = 0x0D,
KeyK = 0x0E,
KeyL = 0x0F,
KeyM = 0x10,
KeyN = 0x11,
KeyO = 0x12,
KeyP = 0x13,
KeyQ = 0x14,
KeyR = 0x15,
KeyS = 0x16,
KeyT = 0x17,
KeyU = 0x18,
KeyV = 0x19,
KeyW = 0x1A,
KeyX = 0x1B,
KeyY = 0x1C,
KeyZ = 0x1D,
Key1 = 0x1E,
Key2 = 0x1F,
Key3 = 0x20,
Key4 = 0x21,
Key5 = 0x22,
Key6 = 0x23,
Key7 = 0x24,
Key8 = 0x25,
Key9 = 0x26,
Key0 = 0x27,
KeyEnter = 0x28,
KeyEsc = 0x29,
KeyBackspace = 0x2A,
KeyTab = 0x2B,
KeySpace = 0x2C,
KeyMinus = 0x2D,
KeyEqual = 0x2E,
KeyLeftBracket = 0x2F,
KeyRightBracket = 0x30,
KeyBackslash = 0x31,
KeySemicolon = 0x33,
KeyQuote = 0x34,
KeyBackquote = 0x35,
KeyComma = 0x36,
KeyPeriod = 0x37,
KeySlash = 0x38,
KeyCapsLock = 0x39,
KeyF1 = 0x3A,
KeyF2 = 0x3B,
KeyF3 = 0x3C,
KeyF4 = 0x3D,
KeyF5 = 0x3E,
KeyF6 = 0x3F,
KeyF7 = 0x40,
KeyF8 = 0x41,
KeyF9 = 0x42,
KeyF10 = 0x43,
KeyF11 = 0x44,
KeyF12 = 0x45,
KeyPrintScreen = 0x46,
KeyScrollLock = 0x47,
KeyPause = 0x48,
KeyInsert = 0x49,
KeyHome = 0x4A,
KeyPageUp = 0x4B,
KeyDelete = 0x4C,
KeyEnd = 0x4D,
KeyPageDown = 0x4E,
KeyRight = 0x4F,
KeyLeft = 0x50,
KeyDown = 0x51,
KeyUp = 0x52,
KeypadNumLock = 0x53,
KeypadSlash = 0x54,
KeypadMultiply = 0x55,
KeypadMinus = 0x56,
KeypadPlus = 0x57,
KeypadEnter = 0x58,
Keypad1 = 0x59,
Keypad2 = 0x5A,
Keypad3 = 0x5B,
Keypad4 = 0x5C,
Keypad5 = 0x5D,
Keypad6 = 0x5E,
Keypad7 = 0x5F,
Keypad8 = 0x60,
Keypad9 = 0x61,
Keypad0 = 0x62,
KeypadPeriod = 0x63,
KeyApplication = 0x65,
KeypadEqual = 0x67,
KeyF13 = 0x68,
KeyF14 = 0x69,
KeyF15 = 0x6A,
KeyF16 = 0x6B,
KeyF17 = 0x6C,
KeyF18 = 0x6D,
KeyF19 = 0x6E,
KeyF20 = 0x6F,
KeyF21 = 0x70,
KeyF22 = 0x71,
KeyF23 = 0x72,
KeyF24 = 0x73,
KeyExecute = 0x74,
KeyHelp = 0x75,
KeyMenu = 0x76,
KeySelect = 0x77,
KeyStop = 0x78,
KeyAgain = 0x79,
KeyUndo = 0x7A,
KeyCut = 0x7B,
KeyCopy = 0x7C,
KeyPaste = 0x7D,
KeyFind = 0x7E,
KeyMute = 0x7F,
KeyVolUp = 0x80,
KeyVolDown = 0x81,
KeypadEqual2 = 0x86,
KeySysReq = 0x9A,
KeyCancel = 0x9B,
KeyClear = 0x9C,
KeyPrior = 0x9D,
KeyReturn = 0x9E,
KeySeparator = 0x9F,
KeyOut = 0xA0,
KeyOper = 0xA1,
KeyClearAgain = 0xA2,
KeyCrSel = 0xA3,
KeyExSel = 0xA4,
Keypad00 = 0xB0,
Keypad000 = 0xB1,
KeyThousandsSep = 0xB2,
KeyDecimalSep = 0xB3,
KeyCurrencyUnit = 0xB4,
KeyCurrencySubUnit = 0xB5,
KeypadLeftParenthesis = 0xB6,
KeypadRightParenthesis = 0xB7,
KeypadLeftBrace = 0xB8,
KeypadRightBrace = 0xB9,
KeypadTab = 0xBA,
KeypadBackspace = 0xBB,
KeypadA = 0xBC,
KeypadB = 0xBD,
KeypadC = 0xBE,
KeypadD = 0xBF,
KeypadE = 0xC0,
KeypadF = 0xC1,
KeypadXOR = 0xC2,
KeypadCaret = 0xC3,
KeypadPercent = 0xC4,
KeypadLessThan = 0xC5,
KeypadGreaterThan = 0xC6,
KeypadAmpersand = 0xC7,
KeypadDoubleAmpersand = 0xC8,
KeypadPipe = 0xC9,
KeypadDoublePipe = 0xCA,
KeypadColon = 0xCB,
KeypadHash = 0xCC,
KeypadSpace = 0xCD,
KeypadAt = 0xCE,
KeypadExclamation = 0xCF,
KeypadMemStore = 0xD0,
KeypadMemRecall = 0xD1,
KeypadMemClear = 0xD2,
KeypadMemAdd = 0xD3,
KeypadMemSub = 0xD4,
KeypadMemMul = 0xD5,
KeypadMemDiv = 0xD6,
KeypadPlusMinus = 0xD7,
KeypadClear = 0xD8,
KeypadClearEntry = 0xD9,
KeypadBin = 0xDA,
KeypadOct = 0xDB,
KeypadDec = 0xDC,
KeypadHex = 0xDD,
}
pub(super) struct USKbd;
impl KbdMap for USKbd {
#[allow(clippy::too_many_lines)]
fn key(&self, c: char) -> Option<Key> {
use KeyUsage::*;
Some(match c {
'`' => Key::from(KeyBackquote),
'1' => Key::from(Key1),
'2' => Key::from(Key2),
'3' => Key::from(Key3),
'4' => Key::from(Key4),
'5' => Key::from(Key5),
'6' => Key::from(Key6),
'7' => Key::from(Key7),
'8' => Key::from(Key8),
'9' => Key::from(Key9),
'0' => Key::from(Key0),
'-' => Key::from(KeyMinus),
'=' => Key::from(KeyEqual),
'\u{08}' => Key::from(KeyBackspace),
'~' => Key::shift(KeyBackquote),
'!' => Key::shift(Key1),
'@' => Key::shift(Key2),
'#' => Key::shift(Key3),
'$' => Key::shift(Key4),
'%' => Key::shift(Key5),
'^' => Key::shift(Key6),
'&' => Key::shift(Key7),
'*' => Key::shift(Key8),
'(' => Key::shift(Key9),
')' => Key::shift(Key0),
'_' => Key::shift(KeyMinus),
'+' => Key::shift(KeyEqual),
'\t' => Key::from(KeyTab),
'q' => Key::from(KeyQ),
'w' => Key::from(KeyW),
'e' => Key::from(KeyE),
'r' => Key::from(KeyR),
't' => Key::from(KeyT),
'y' => Key::from(KeyY),
'u' => Key::from(KeyU),
'i' => Key::from(KeyI),
'o' => Key::from(KeyO),
'p' => Key::from(KeyP),
'[' => Key::from(KeyLeftBracket),
']' => Key::from(KeyRightBracket),
'\\' => Key::from(KeyBackslash),
'Q' => Key::shift(KeyQ),
'W' => Key::shift(KeyW),
'E' => Key::shift(KeyE),
'R' => Key::shift(KeyR),
'T' => Key::shift(KeyT),
'Y' => Key::shift(KeyY),
'U' => Key::shift(KeyU),
'I' => Key::shift(KeyI),
'O' => Key::shift(KeyO),
'P' => Key::shift(KeyP),
'{' => Key::shift(KeyLeftBracket),
'}' => Key::shift(KeyRightBracket),
'|' => Key::shift(KeyBackslash),
'a' => Key::from(KeyA),
's' => Key::from(KeyS),
'd' => Key::from(KeyD),
'f' => Key::from(KeyF),
'g' => Key::from(KeyG),
'h' => Key::from(KeyH),
'j' => Key::from(KeyJ),
'k' => Key::from(KeyK),
'l' => Key::from(KeyL),
';' => Key::from(KeySemicolon),
'\'' => Key::from(KeyQuote),
'\n' => Key::from(KeyEnter),
'A' => Key::shift(KeyA),
'S' => Key::shift(KeyS),
'D' => Key::shift(KeyD),
'F' => Key::shift(KeyF),
'G' => Key::shift(KeyG),
'H' => Key::shift(KeyH),
'J' => Key::shift(KeyJ),
'K' => Key::shift(KeyK),
'L' => Key::shift(KeyL),
':' => Key::shift(KeySemicolon),
'"' => Key::shift(KeyQuote),
'z' => Key::from(KeyZ),
'x' => Key::from(KeyX),
'c' => Key::from(KeyC),
'v' => Key::from(KeyV),
'b' => Key::from(KeyB),
'n' => Key::from(KeyN),
'm' => Key::from(KeyM),
',' => Key::from(KeyComma),
'.' => Key::from(KeyPeriod),
'/' => Key::from(KeySlash),
'Z' => Key::shift(KeyZ),
'X' => Key::shift(KeyX),
'C' => Key::shift(KeyC),
'V' => Key::shift(KeyV),
'B' => Key::shift(KeyB),
'N' => Key::shift(KeyN),
'M' => Key::shift(KeyM),
'<' => Key::shift(KeyComma),
'>' => Key::shift(KeyPeriod),
'?' => Key::shift(KeySlash),
' ' => Key::from(KeySpace),
'\u{007F}' => Key::from(KeyDelete),
_ => return None,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn us_kbd() {
let keys = vec![
'`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\u{08}', '~', '!',
'@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\', 'Q', 'W', 'E',
'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\n', 'A', 'S', 'D', 'F', 'G',
'H', 'J', 'K', 'L', ':', '"', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 'Z', 'X', 'C', 'V', 'B', 'N', 'M',
'<', '>', '?', ' ', '\u{007F}', ];
let kbd = USKbd {};
for k in keys {
assert!(kbd.key(k).is_some());
}
assert!(kbd.key('\u{0080}').is_none());
}
}