297 lines
10 KiB
Rust
297 lines
10 KiB
Rust
use crate::drivers::keyboard::KeyboardState;
|
||
|
||
#[derive(Debug, Clone, Copy)]
|
||
#[derive_const(PartialEq, Eq)]
|
||
pub enum ModifierType {
|
||
Shift,
|
||
Alt,
|
||
AltGr,
|
||
Control,
|
||
}
|
||
|
||
#[derive(Debug, Clone, Copy)]
|
||
#[derive_const(PartialEq, Eq)]
|
||
pub enum KeyType {
|
||
Ascii(char),
|
||
// Special, // F1, Home, etc.
|
||
Modifier(ModifierType),
|
||
Unknown,
|
||
}
|
||
|
||
pub const fn map_keycode(code: u16, state: &KeyboardState) -> KeyType {
|
||
let res = match code {
|
||
KEY_BACKSPACE => KeyType::Ascii('\x08'),
|
||
KEY_ESCAPE => KeyType::Ascii('\x1b'),
|
||
KEY_TAB => KeyType::Ascii('\t'),
|
||
KEY_ENTER => KeyType::Ascii('\n'),
|
||
KEY_SPACE => KeyType::Ascii(' '),
|
||
KEY_LEFTSHIFT | KEY_RIGHTSHIFT => KeyType::Modifier(ModifierType::Shift),
|
||
KEY_LEFTCTRL => KeyType::Modifier(ModifierType::Control),
|
||
KEY_LEFTALT => KeyType::Modifier(ModifierType::Alt),
|
||
KEY_RIGHTALT => KeyType::Modifier(ModifierType::AltGr),
|
||
|
||
_ => KeyType::Unknown,
|
||
};
|
||
if res != KeyType::Unknown {
|
||
return res;
|
||
}
|
||
|
||
if state.shift_modifier {
|
||
match code {
|
||
KEY_1 => KeyType::Ascii('1'),
|
||
KEY_2 => KeyType::Ascii('2'),
|
||
KEY_3 => KeyType::Ascii('3'),
|
||
KEY_4 => KeyType::Ascii('4'),
|
||
KEY_5 => KeyType::Ascii('5'),
|
||
KEY_6 => KeyType::Ascii('6'),
|
||
KEY_7 => KeyType::Ascii('7'),
|
||
KEY_8 => KeyType::Ascii('8'),
|
||
KEY_9 => KeyType::Ascii('9'),
|
||
KEY_0 => KeyType::Ascii('0'),
|
||
KEY_MINUS => KeyType::Ascii('°'),
|
||
KEY_EQUAL => KeyType::Ascii('`'),
|
||
|
||
KEY_Q => KeyType::Ascii('B'),
|
||
KEY_W => KeyType::Ascii('É'),
|
||
KEY_E => KeyType::Ascii('P'),
|
||
KEY_R => KeyType::Ascii('O'),
|
||
KEY_T => KeyType::Ascii('È'),
|
||
KEY_Y => KeyType::Ascii('!'),
|
||
KEY_U => KeyType::Ascii('V'),
|
||
KEY_I => KeyType::Ascii('D'),
|
||
KEY_O => KeyType::Ascii('L'),
|
||
KEY_P => KeyType::Ascii('J'),
|
||
KEY_A => KeyType::Ascii('A'),
|
||
KEY_S => KeyType::Ascii('U'),
|
||
KEY_D => KeyType::Ascii('I'),
|
||
KEY_F => KeyType::Ascii('E'),
|
||
KEY_G => KeyType::Ascii(';'),
|
||
KEY_H => KeyType::Ascii('C'),
|
||
KEY_J => KeyType::Ascii('T'),
|
||
KEY_K => KeyType::Ascii('S'),
|
||
KEY_L => KeyType::Ascii('R'),
|
||
KEY_Z => KeyType::Ascii('À'),
|
||
KEY_X => KeyType::Ascii('Y'),
|
||
KEY_C => KeyType::Ascii('X'),
|
||
KEY_V => KeyType::Ascii(':'),
|
||
KEY_B => KeyType::Ascii('K'),
|
||
KEY_N => KeyType::Ascii('?'),
|
||
KEY_M => KeyType::Ascii('Q'),
|
||
|
||
KEY_LEFTBRACE => KeyType::Ascii('Z'),
|
||
KEY_RIGHTBRACE => KeyType::Ascii('W'),
|
||
KEY_BACKSLASH => KeyType::Ascii('Ç'),
|
||
|
||
KEY_SEMICOLON => KeyType::Ascii('N'),
|
||
KEY_APOSTROPHE => KeyType::Ascii('M'),
|
||
|
||
KEY_COMMA => KeyType::Ascii('G'),
|
||
KEY_DOT => KeyType::Ascii('H'),
|
||
KEY_SLASH => KeyType::Ascii('F'),
|
||
|
||
_ => KeyType::Unknown,
|
||
}
|
||
} else {
|
||
if state.alt_gr_modifier {
|
||
match code {
|
||
// KEY_1 => KeyType::Ascii('—'),
|
||
KEY_2 => KeyType::Ascii('<'),
|
||
KEY_3 => KeyType::Ascii('>'),
|
||
KEY_4 => KeyType::Ascii('['),
|
||
KEY_5 => KeyType::Ascii(']'),
|
||
KEY_6 => KeyType::Ascii('^'),
|
||
KEY_7 => KeyType::Ascii('±'),
|
||
// KEY_8 => KeyType::Ascii('−'),
|
||
KEY_9 => KeyType::Ascii('÷'),
|
||
KEY_0 => KeyType::Ascii('×'),
|
||
KEY_MINUS => KeyType::Ascii('≠'),
|
||
KEY_EQUAL => KeyType::Ascii('‰'),
|
||
KEY_Q => KeyType::Ascii('|'),
|
||
// KEY_W => KeyType::Ascii(''),
|
||
KEY_E => KeyType::Ascii('&'),
|
||
KEY_R => KeyType::Ascii('œ'),
|
||
// KEY_T => KeyType::Ascii(''),
|
||
KEY_Y => KeyType::Ascii('¡'),
|
||
// KEY_U => KeyType::Ascii(''),
|
||
KEY_I => KeyType::Ascii('ð'),
|
||
// KEY_O => KeyType::Ascii(''),
|
||
KEY_P => KeyType::Ascii('ij'),
|
||
KEY_A => KeyType::Ascii('æ'),
|
||
KEY_S => KeyType::Ascii('ù'),
|
||
// KEY_D => KeyType::Ascii(''),
|
||
// KEY_F => KeyType::Ascii('€'),
|
||
// KEY_G => KeyType::Ascii('’'),
|
||
KEY_H => KeyType::Ascii('©'),
|
||
KEY_J => KeyType::Ascii('þ'),
|
||
KEY_K => KeyType::Ascii('ß'),
|
||
KEY_L => KeyType::Ascii('®'),
|
||
KEY_Z => KeyType::Ascii('\\'),
|
||
KEY_X => KeyType::Ascii('{'),
|
||
KEY_C => KeyType::Ascii('}'),
|
||
// KEY_V => KeyType::Ascii('…'),
|
||
KEY_B => KeyType::Ascii('~'),
|
||
KEY_N => KeyType::Ascii('¿'),
|
||
// KEY_M => KeyType::Ascii(''),
|
||
KEY_LEFTBRACE => KeyType::Ascii('ə'),
|
||
// KEY_RIGHTBRACE => KeyType::Ascii(''),
|
||
// KEY_SEMICOLON => KeyType::Ascii(''),
|
||
// KEY_APOSTROPHE => KeyType::Ascii(''),
|
||
// KEY_COMMA => KeyType::Ascii(''),
|
||
// KEY_DOT => KeyType::Ascii('†'),
|
||
// KEY_SLASH => KeyType::Ascii(''),
|
||
_ => KeyType::Unknown,
|
||
}
|
||
} else {
|
||
match code {
|
||
KEY_1 => KeyType::Ascii('"'),
|
||
KEY_2 => KeyType::Ascii('«'),
|
||
KEY_3 => KeyType::Ascii('»'),
|
||
KEY_4 => KeyType::Ascii('('),
|
||
KEY_5 => KeyType::Ascii(')'),
|
||
KEY_6 => KeyType::Ascii('@'),
|
||
KEY_7 => KeyType::Ascii('+'),
|
||
KEY_8 => KeyType::Ascii('-'),
|
||
KEY_9 => KeyType::Ascii('/'),
|
||
KEY_0 => KeyType::Ascii('*'),
|
||
KEY_MINUS => KeyType::Ascii('='),
|
||
KEY_EQUAL => KeyType::Ascii('%'),
|
||
|
||
KEY_Q => KeyType::Ascii('b'),
|
||
KEY_W => KeyType::Ascii('é'),
|
||
KEY_E => KeyType::Ascii('p'),
|
||
KEY_R => KeyType::Ascii('o'),
|
||
KEY_T => KeyType::Ascii('è'),
|
||
KEY_Y => KeyType::Ascii('^'),
|
||
KEY_U => KeyType::Ascii('v'),
|
||
KEY_I => KeyType::Ascii('d'),
|
||
KEY_O => KeyType::Ascii('l'),
|
||
KEY_P => KeyType::Ascii('j'),
|
||
KEY_A => KeyType::Ascii('a'),
|
||
KEY_S => KeyType::Ascii('u'),
|
||
KEY_D => KeyType::Ascii('i'),
|
||
KEY_F => KeyType::Ascii('e'),
|
||
KEY_G => KeyType::Ascii(','),
|
||
KEY_H => KeyType::Ascii('c'),
|
||
KEY_J => KeyType::Ascii('t'),
|
||
KEY_K => KeyType::Ascii('s'),
|
||
KEY_L => KeyType::Ascii('r'),
|
||
KEY_Z => KeyType::Ascii('à'),
|
||
KEY_X => KeyType::Ascii('y'),
|
||
KEY_C => KeyType::Ascii('x'),
|
||
KEY_V => KeyType::Ascii('.'),
|
||
KEY_B => KeyType::Ascii('k'),
|
||
KEY_N => KeyType::Ascii('\''),
|
||
KEY_M => KeyType::Ascii('q'),
|
||
|
||
KEY_LEFTBRACE => KeyType::Ascii('z'),
|
||
KEY_RIGHTBRACE => KeyType::Ascii('w'),
|
||
KEY_BACKSLASH => KeyType::Ascii('ç'),
|
||
|
||
KEY_SEMICOLON => KeyType::Ascii('n'),
|
||
KEY_APOSTROPHE => KeyType::Ascii('m'),
|
||
|
||
KEY_COMMA => KeyType::Ascii('g'),
|
||
KEY_DOT => KeyType::Ascii('h'),
|
||
KEY_SLASH => KeyType::Ascii('f'),
|
||
|
||
_ => KeyType::Unknown,
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// pub const KEY_RESERVED: u16 = 0;
|
||
pub const KEY_ESCAPE: u16 = 1;
|
||
|
||
pub const KEY_1: u16 = 2;
|
||
pub const KEY_2: u16 = 3;
|
||
pub const KEY_3: u16 = 4;
|
||
pub const KEY_4: u16 = 5;
|
||
pub const KEY_5: u16 = 6;
|
||
pub const KEY_6: u16 = 7;
|
||
pub const KEY_7: u16 = 8;
|
||
pub const KEY_8: u16 = 9;
|
||
pub const KEY_9: u16 = 10;
|
||
pub const KEY_0: u16 = 11;
|
||
pub const KEY_MINUS: u16 = 12;
|
||
pub const KEY_EQUAL: u16 = 13;
|
||
pub const KEY_BACKSPACE: u16 = 14;
|
||
|
||
pub const KEY_TAB: u16 = 15;
|
||
|
||
pub const KEY_Q: u16 = 16;
|
||
pub const KEY_W: u16 = 17;
|
||
pub const KEY_E: u16 = 18;
|
||
pub const KEY_R: u16 = 19;
|
||
pub const KEY_T: u16 = 20;
|
||
pub const KEY_Y: u16 = 21;
|
||
pub const KEY_U: u16 = 22;
|
||
pub const KEY_I: u16 = 23;
|
||
pub const KEY_O: u16 = 24;
|
||
pub const KEY_P: u16 = 25;
|
||
|
||
pub const KEY_LEFTBRACE: u16 = 26;
|
||
pub const KEY_RIGHTBRACE: u16 = 27;
|
||
|
||
pub const KEY_ENTER: u16 = 28;
|
||
pub const KEY_LEFTCTRL: u16 = 29;
|
||
|
||
pub const KEY_A: u16 = 30;
|
||
pub const KEY_S: u16 = 31;
|
||
pub const KEY_D: u16 = 32;
|
||
pub const KEY_F: u16 = 33;
|
||
pub const KEY_G: u16 = 34;
|
||
pub const KEY_H: u16 = 35;
|
||
pub const KEY_J: u16 = 36;
|
||
pub const KEY_K: u16 = 37;
|
||
pub const KEY_L: u16 = 38;
|
||
|
||
pub const KEY_SEMICOLON: u16 = 39;
|
||
pub const KEY_APOSTROPHE: u16 = 40;
|
||
// pub const KEY_GRAVE: u16 = 41;
|
||
|
||
pub const KEY_LEFTSHIFT: u16 = 42;
|
||
pub const KEY_BACKSLASH: u16 = 43;
|
||
pub const KEY_Z: u16 = 44;
|
||
pub const KEY_X: u16 = 45;
|
||
pub const KEY_C: u16 = 46;
|
||
pub const KEY_V: u16 = 47;
|
||
pub const KEY_B: u16 = 48;
|
||
pub const KEY_N: u16 = 49;
|
||
pub const KEY_M: u16 = 50;
|
||
pub const KEY_COMMA: u16 = 51;
|
||
pub const KEY_DOT: u16 = 52;
|
||
pub const KEY_SLASH: u16 = 53;
|
||
|
||
pub const KEY_RIGHTSHIFT: u16 = 54;
|
||
pub const KEY_LEFTALT: u16 = 56;
|
||
pub const KEY_SPACE: u16 = 57;
|
||
// pub const KEY_CAPSLOCK: u16 = 58;
|
||
|
||
// pub const KEY_F1: u16 = 59;
|
||
// pub const KEY_F2: u16 = 60;
|
||
// pub const KEY_F3: u16 = 61;
|
||
// pub const KEY_F4: u16 = 62;
|
||
// pub const KEY_F5: u16 = 63;
|
||
// pub const KEY_F6: u16 = 64;
|
||
// pub const KEY_F7: u16 = 65;
|
||
// pub const KEY_F8: u16 = 66;
|
||
// pub const KEY_F9: u16 = 67;
|
||
// pub const KEY_F10: u16 = 68;
|
||
|
||
pub const KEY_RIGHTALT: u16 = 100;
|
||
// pub const KEY_HOME: u16 = 102;
|
||
// pub const KEY_UP: u16 = 103;
|
||
// pub const KEY_PAGEUP: u16 = 104;
|
||
// pub const KEY_LEFT: u16 = 105;
|
||
// pub const KEY_RIGHT: u16 = 106;
|
||
// pub const KEY_END: u16 = 107;
|
||
// pub const KEY_DOWN: u16 = 108;
|
||
// pub const KEY_PAGEDOWN: u16 = 109;
|
||
// pub const KEY_INSERT: u16 = 110;
|
||
// pub const KEY_DELETE: u16 = 111;
|
||
|
||
// pub const KEY_MUTE: u16 = 113;
|
||
// pub const KEY_VOLUMEDOWN: u16 = 114;
|
||
// pub const KEY_VOLUMEUP: u16 = 115;
|