#[derive(Debug, Clone, Copy)]
pub struct KeyDefinition {
pub key_code: Option<i64>,
pub key: &'static str,
pub code: &'static str,
pub text: Option<&'static str>,
pub shift_key: Option<&'static str>,
pub shift_text: Option<&'static str>,
pub location: Option<i64>,
}
pub fn key_definition(key: &str) -> Option<KeyDefinition> {
match key {
"\r" | "\n" | "Enter" => Some(KeyDefinition {
key_code: Some(13),
key: "Enter",
code: "Enter",
text: Some("\r"),
shift_key: None,
shift_text: None,
location: None,
}),
"Tab" => Some(KeyDefinition {
key_code: Some(9),
key: "Tab",
code: "Tab",
text: Some("\t"),
shift_key: None,
shift_text: None,
location: None,
}),
"Backspace" => Some(KeyDefinition {
key_code: Some(8),
key: "Backspace",
code: "Backspace",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"Escape" => Some(KeyDefinition {
key_code: Some(27),
key: "Escape",
code: "Escape",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"Delete" => Some(KeyDefinition {
key_code: Some(46),
key: "Delete",
code: "Delete",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"Insert" => Some(KeyDefinition {
key_code: Some(45),
key: "Insert",
code: "Insert",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"Home" => Some(KeyDefinition {
key_code: Some(36),
key: "Home",
code: "Home",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"End" => Some(KeyDefinition {
key_code: Some(35),
key: "End",
code: "End",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"PageUp" => Some(KeyDefinition {
key_code: Some(33),
key: "PageUp",
code: "PageUp",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"PageDown" => Some(KeyDefinition {
key_code: Some(34),
key: "PageDown",
code: "PageDown",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"ArrowLeft" => Some(KeyDefinition {
key_code: Some(37),
key: "ArrowLeft",
code: "ArrowLeft",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"ArrowUp" => Some(KeyDefinition {
key_code: Some(38),
key: "ArrowUp",
code: "ArrowUp",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"ArrowRight" => Some(KeyDefinition {
key_code: Some(39),
key: "ArrowRight",
code: "ArrowRight",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"ArrowDown" => Some(KeyDefinition {
key_code: Some(40),
key: "ArrowDown",
code: "ArrowDown",
text: None,
shift_key: None,
shift_text: None,
location: None,
}),
"Shift" | "ShiftLeft" => Some(KeyDefinition {
key_code: Some(16),
key: "Shift",
code: "ShiftLeft",
text: None,
shift_key: None,
shift_text: None,
location: Some(1),
}),
"ShiftRight" => Some(KeyDefinition {
key_code: Some(16),
key: "Shift",
code: "ShiftRight",
text: None,
shift_key: None,
shift_text: None,
location: Some(2),
}),
"Control" | "ControlLeft" => Some(KeyDefinition {
key_code: Some(17),
key: "Control",
code: "ControlLeft",
text: None,
shift_key: None,
shift_text: None,
location: Some(1),
}),
"ControlRight" => Some(KeyDefinition {
key_code: Some(17),
key: "Control",
code: "ControlRight",
text: None,
shift_key: None,
shift_text: None,
location: Some(2),
}),
"Alt" | "AltLeft" => Some(KeyDefinition {
key_code: Some(18),
key: "Alt",
code: "AltLeft",
text: None,
shift_key: None,
shift_text: None,
location: Some(1),
}),
"AltRight" => Some(KeyDefinition {
key_code: Some(18),
key: "Alt",
code: "AltRight",
text: None,
shift_key: None,
shift_text: None,
location: Some(2),
}),
"Meta" | "MetaLeft" => Some(KeyDefinition {
key_code: Some(91),
key: "Meta",
code: "MetaLeft",
text: None,
shift_key: None,
shift_text: None,
location: Some(1),
}),
"MetaRight" => Some(KeyDefinition {
key_code: Some(92),
key: "Meta",
code: "MetaRight",
text: None,
shift_key: None,
shift_text: None,
location: Some(2),
}),
"Space" | " " => Some(KeyDefinition {
key_code: Some(32),
key: " ",
code: "Space",
text: Some(" "),
shift_key: None,
shift_text: None,
location: None,
}),
"F1" => Some(function_key("F1", 112)),
"F2" => Some(function_key("F2", 113)),
"F3" => Some(function_key("F3", 114)),
"F4" => Some(function_key("F4", 115)),
"F5" => Some(function_key("F5", 116)),
"F6" => Some(function_key("F6", 117)),
"F7" => Some(function_key("F7", 118)),
"F8" => Some(function_key("F8", 119)),
"F9" => Some(function_key("F9", 120)),
"F10" => Some(function_key("F10", 121)),
"F11" => Some(function_key("F11", 122)),
"F12" => Some(function_key("F12", 123)),
_ => from_printable(key),
}
}
fn function_key(name: &'static str, key_code: i64) -> KeyDefinition {
KeyDefinition {
key_code: Some(key_code),
key: name,
code: name,
text: None,
shift_key: None,
shift_text: None,
location: None,
}
}
fn from_printable(key: &str) -> Option<KeyDefinition> {
match key {
"a" | "A" | "KeyA" => Some(letter("a", "A", "KeyA", 65)),
"b" | "B" | "KeyB" => Some(letter("b", "B", "KeyB", 66)),
"c" | "C" | "KeyC" => Some(letter("c", "C", "KeyC", 67)),
"d" | "D" | "KeyD" => Some(letter("d", "D", "KeyD", 68)),
"e" | "E" | "KeyE" => Some(letter("e", "E", "KeyE", 69)),
"f" | "F" | "KeyF" => Some(letter("f", "F", "KeyF", 70)),
"g" | "G" | "KeyG" => Some(letter("g", "G", "KeyG", 71)),
"h" | "H" | "KeyH" => Some(letter("h", "H", "KeyH", 72)),
"i" | "I" | "KeyI" => Some(letter("i", "I", "KeyI", 73)),
"j" | "J" | "KeyJ" => Some(letter("j", "J", "KeyJ", 74)),
"k" | "K" | "KeyK" => Some(letter("k", "K", "KeyK", 75)),
"l" | "L" | "KeyL" => Some(letter("l", "L", "KeyL", 76)),
"m" | "M" | "KeyM" => Some(letter("m", "M", "KeyM", 77)),
"n" | "N" | "KeyN" => Some(letter("n", "N", "KeyN", 78)),
"o" | "O" | "KeyO" => Some(letter("o", "O", "KeyO", 79)),
"p" | "P" | "KeyP" => Some(letter("p", "P", "KeyP", 80)),
"q" | "Q" | "KeyQ" => Some(letter("q", "Q", "KeyQ", 81)),
"r" | "R" | "KeyR" => Some(letter("r", "R", "KeyR", 82)),
"s" | "S" | "KeyS" => Some(letter("s", "S", "KeyS", 83)),
"t" | "T" | "KeyT" => Some(letter("t", "T", "KeyT", 84)),
"u" | "U" | "KeyU" => Some(letter("u", "U", "KeyU", 85)),
"v" | "V" | "KeyV" => Some(letter("v", "V", "KeyV", 86)),
"w" | "W" | "KeyW" => Some(letter("w", "W", "KeyW", 87)),
"x" | "X" | "KeyX" => Some(letter("x", "X", "KeyX", 88)),
"y" | "Y" | "KeyY" => Some(letter("y", "Y", "KeyY", 89)),
"z" | "Z" | "KeyZ" => Some(letter("z", "Z", "KeyZ", 90)),
"0" | ")" | "Digit0" => Some(digit("0", ")", "Digit0", 48)),
"1" | "!" | "Digit1" => Some(digit("1", "!", "Digit1", 49)),
"2" | "@" | "Digit2" => Some(digit("2", "@", "Digit2", 50)),
"3" | "#" | "Digit3" => Some(digit("3", "#", "Digit3", 51)),
"4" | "$" | "Digit4" => Some(digit("4", "$", "Digit4", 52)),
"5" | "%" | "Digit5" => Some(digit("5", "%", "Digit5", 53)),
"6" | "^" | "Digit6" => Some(digit("6", "^", "Digit6", 54)),
"7" | "&" | "Digit7" => Some(digit("7", "&", "Digit7", 55)),
"8" | "*" | "Digit8" => Some(digit("8", "*", "Digit8", 56)),
"9" | "(" | "Digit9" => Some(digit("9", "(", "Digit9", 57)),
";" | ":" | "Semicolon" => Some(symbol(";", ":", "Semicolon", 186)),
"=" | "+" | "Equal" => Some(symbol("=", "+", "Equal", 187)),
"," | "<" | "Comma" => Some(symbol(",", "<", "Comma", 188)),
"-" | "_" | "Minus" => Some(symbol("-", "_", "Minus", 189)),
"." | ">" | "Period" => Some(symbol(".", ">", "Period", 190)),
"/" | "?" | "Slash" => Some(symbol("/", "?", "Slash", 191)),
"`" | "~" | "Backquote" => Some(symbol("`", "~", "Backquote", 192)),
"[" | "{" | "BracketLeft" => Some(symbol("[", "{", "BracketLeft", 219)),
"\\" | "|" | "Backslash" => Some(symbol("\\", "|", "Backslash", 220)),
"]" | "}" | "BracketRight" => Some(symbol("]", "}", "BracketRight", 221)),
"'" | "\"" | "Quote" => Some(symbol("'", "\"", "Quote", 222)),
_ => None,
}
}
fn letter(
key: &'static str,
shift_key: &'static str,
code: &'static str,
key_code: i64,
) -> KeyDefinition {
KeyDefinition {
key_code: Some(key_code),
key,
code,
text: Some(key),
shift_key: Some(shift_key),
shift_text: Some(shift_key),
location: None,
}
}
fn digit(
key: &'static str,
shift_key: &'static str,
code: &'static str,
key_code: i64,
) -> KeyDefinition {
KeyDefinition {
key_code: Some(key_code),
key,
code,
text: Some(key),
shift_key: Some(shift_key),
shift_text: Some(shift_key),
location: None,
}
}
fn symbol(
key: &'static str,
shift_key: &'static str,
code: &'static str,
key_code: i64,
) -> KeyDefinition {
KeyDefinition {
key_code: Some(key_code),
key,
code,
text: Some(key),
shift_key: Some(shift_key),
shift_text: Some(shift_key),
location: None,
}
}