624 lines
30 KiB
Rust
624 lines
30 KiB
Rust
#![allow(clippy::too_many_arguments)]
|
|
use super::*;
|
|
pub struct CustomScanCodeSet {
|
|
single_byte: [Option<KeyCode>; 256],
|
|
extended: [Option<KeyCode>; 256],
|
|
}
|
|
impl Default for CustomScanCodeSet {
|
|
fn default() -> Self {
|
|
Self::scancode_set1()
|
|
}
|
|
}
|
|
impl CustomScanCodeSet {
|
|
pub fn scancode_set1() -> Self {
|
|
let mut scancode_set = Self {
|
|
single_byte: [None; 256],
|
|
extended: [None; 256],
|
|
};
|
|
scancode_set.single_byte[0x01] = Some(KeyCode::Escape); // 01
|
|
scancode_set.single_byte[0x02] = Some(KeyCode::Key1); // 02
|
|
scancode_set.single_byte[0x03] = Some(KeyCode::Key2); // 03
|
|
scancode_set.single_byte[0x04] = Some(KeyCode::Key3); // 04
|
|
scancode_set.single_byte[0x05] = Some(KeyCode::Key4); // 05
|
|
scancode_set.single_byte[0x06] = Some(KeyCode::Key5); // 06
|
|
scancode_set.single_byte[0x07] = Some(KeyCode::Key6); // 07
|
|
scancode_set.single_byte[0x08] = Some(KeyCode::Key7); // 08
|
|
scancode_set.single_byte[0x09] = Some(KeyCode::Key8); // 09
|
|
scancode_set.single_byte[0x0A] = Some(KeyCode::Key9); // 0A
|
|
scancode_set.single_byte[0x0B] = Some(KeyCode::Key0); // 0B
|
|
scancode_set.single_byte[0x0C] = Some(KeyCode::Minus); // 0C
|
|
scancode_set.single_byte[0x0D] = Some(KeyCode::Equals); // 0D
|
|
scancode_set.single_byte[0x0E] = Some(KeyCode::Backspace); // 0E
|
|
scancode_set.single_byte[0x0F] = Some(KeyCode::Tab); // 0F
|
|
scancode_set.single_byte[0x10] = Some(KeyCode::Q); // 10
|
|
scancode_set.single_byte[0x11] = Some(KeyCode::W); // 11
|
|
scancode_set.single_byte[0x12] = Some(KeyCode::E); // 12
|
|
scancode_set.single_byte[0x13] = Some(KeyCode::R); // 13
|
|
scancode_set.single_byte[0x14] = Some(KeyCode::T); // 14
|
|
scancode_set.single_byte[0x15] = Some(KeyCode::Y); // 15
|
|
scancode_set.single_byte[0x16] = Some(KeyCode::U); // 16
|
|
scancode_set.single_byte[0x17] = Some(KeyCode::I); // 17
|
|
scancode_set.single_byte[0x18] = Some(KeyCode::O); // 18
|
|
scancode_set.single_byte[0x19] = Some(KeyCode::P); // 19
|
|
scancode_set.single_byte[0x1A] = Some(KeyCode::BracketSquareLeft); // 1A
|
|
scancode_set.single_byte[0x1B] = Some(KeyCode::BracketSquareRight); // 1B
|
|
scancode_set.single_byte[0x1C] = Some(KeyCode::Enter); // 1C
|
|
scancode_set.single_byte[0x1D] = Some(KeyCode::ControlLeft); // 1D
|
|
scancode_set.single_byte[0x1E] = Some(KeyCode::A); // 1E
|
|
scancode_set.single_byte[0x1F] = Some(KeyCode::S); // 1F
|
|
scancode_set.single_byte[0x20] = Some(KeyCode::D); // 20
|
|
scancode_set.single_byte[0x21] = Some(KeyCode::F); // 21
|
|
scancode_set.single_byte[0x22] = Some(KeyCode::G); // 22
|
|
scancode_set.single_byte[0x23] = Some(KeyCode::H); // 23
|
|
scancode_set.single_byte[0x24] = Some(KeyCode::J); // 24
|
|
scancode_set.single_byte[0x25] = Some(KeyCode::K); // 25
|
|
scancode_set.single_byte[0x26] = Some(KeyCode::L); // 26
|
|
scancode_set.single_byte[0x27] = Some(KeyCode::SemiColon); // 27
|
|
scancode_set.single_byte[0x28] = Some(KeyCode::Quote); // 28
|
|
scancode_set.single_byte[0x29] = Some(KeyCode::BackTick); // 29
|
|
scancode_set.single_byte[0x2A] = Some(KeyCode::ShiftLeft); // 2A
|
|
scancode_set.single_byte[0x2B] = Some(KeyCode::BackSlash); // 2B
|
|
scancode_set.single_byte[0x2C] = Some(KeyCode::Z); // 2C
|
|
scancode_set.single_byte[0x2D] = Some(KeyCode::X); // 2D
|
|
scancode_set.single_byte[0x2E] = Some(KeyCode::C); // 2E
|
|
scancode_set.single_byte[0x2F] = Some(KeyCode::V); // 2F
|
|
scancode_set.single_byte[0x30] = Some(KeyCode::B); // 30
|
|
scancode_set.single_byte[0x31] = Some(KeyCode::N); // 31
|
|
scancode_set.single_byte[0x32] = Some(KeyCode::M); // 32
|
|
scancode_set.single_byte[0x33] = Some(KeyCode::Comma); // 33
|
|
scancode_set.single_byte[0x34] = Some(KeyCode::Fullstop); // 34
|
|
scancode_set.single_byte[0x35] = Some(KeyCode::Slash); // 35
|
|
scancode_set.single_byte[0x36] = Some(KeyCode::ShiftRight); // 36
|
|
scancode_set.single_byte[0x37] = Some(KeyCode::NumpadStar); // 37
|
|
scancode_set.single_byte[0x38] = Some(KeyCode::AltLeft); // 38
|
|
scancode_set.single_byte[0x39] = Some(KeyCode::Spacebar); // 39
|
|
scancode_set.single_byte[0x3A] = Some(KeyCode::CapsLock); // 3A
|
|
scancode_set.single_byte[0x3B] = Some(KeyCode::F1); // 3B
|
|
scancode_set.single_byte[0x3C] = Some(KeyCode::F2); // 3C
|
|
scancode_set.single_byte[0x3D] = Some(KeyCode::F3); // 3D
|
|
scancode_set.single_byte[0x3E] = Some(KeyCode::F4); // 3E
|
|
scancode_set.single_byte[0x3F] = Some(KeyCode::F5); // 3F
|
|
scancode_set.single_byte[0x40] = Some(KeyCode::F6); // 40
|
|
scancode_set.single_byte[0x41] = Some(KeyCode::F7); // 41
|
|
scancode_set.single_byte[0x42] = Some(KeyCode::F8); // 42
|
|
scancode_set.single_byte[0x43] = Some(KeyCode::F9); // 43
|
|
scancode_set.single_byte[0x44] = Some(KeyCode::F10); // 44
|
|
scancode_set.single_byte[0x45] = Some(KeyCode::NumpadLock); // 45
|
|
scancode_set.single_byte[0x46] = Some(KeyCode::ScrollLock); // 46
|
|
scancode_set.single_byte[0x47] = Some(KeyCode::Numpad7); // 47
|
|
scancode_set.single_byte[0x48] = Some(KeyCode::Numpad8); // 48
|
|
scancode_set.single_byte[0x49] = Some(KeyCode::Numpad9); // 49
|
|
scancode_set.single_byte[0x4A] = Some(KeyCode::NumpadMinus); // 4A
|
|
scancode_set.single_byte[0x4B] = Some(KeyCode::Numpad4); // 4B
|
|
scancode_set.single_byte[0x4C] = Some(KeyCode::Numpad5); // 4C
|
|
scancode_set.single_byte[0x4D] = Some(KeyCode::Numpad6); // 4D
|
|
scancode_set.single_byte[0x4E] = Some(KeyCode::NumpadPlus); // 4E
|
|
scancode_set.single_byte[0x4F] = Some(KeyCode::Numpad1); // 4F
|
|
scancode_set.single_byte[0x50] = Some(KeyCode::Numpad2); // 50
|
|
scancode_set.single_byte[0x51] = Some(KeyCode::Numpad3); // 51
|
|
scancode_set.single_byte[0x52] = Some(KeyCode::Numpad0); // 52
|
|
scancode_set.single_byte[0x53] = Some(KeyCode::NumpadPeriod); // 53
|
|
// 0x54
|
|
// 0x55
|
|
// 0x56
|
|
scancode_set.single_byte[0x57] = Some(KeyCode::F11); // 57
|
|
scancode_set.single_byte[0x58] = Some(KeyCode::F12); // 58
|
|
for i in 0x81..=0xD8 {
|
|
scancode_set.single_byte[i] = scancode_set.single_byte[i - 0x80];
|
|
}
|
|
scancode_set.extended[0x10] = Some(KeyCode::PrevTrack); // E010
|
|
//0x11
|
|
//0x12
|
|
//0x13
|
|
//0x14
|
|
//0x15
|
|
//0x16
|
|
//0x17
|
|
//0x18
|
|
scancode_set.extended[0x19] = Some(KeyCode::NextTrack); // E019
|
|
//0x1A
|
|
//0x1B
|
|
scancode_set.extended[0x1C] = Some(KeyCode::NumpadEnter); // E01C
|
|
scancode_set.extended[0x1D] = Some(KeyCode::ControlRight); // E01D
|
|
//0x1E
|
|
//0x1F
|
|
scancode_set.extended[0x20] = Some(KeyCode::Mute); // E020
|
|
scancode_set.extended[0x21] = Some(KeyCode::Calculator); // E021
|
|
scancode_set.extended[0x22] = Some(KeyCode::Play); // E022
|
|
//0x23
|
|
scancode_set.extended[0x24] = Some(KeyCode::Stop); // E024
|
|
//0x25
|
|
//0x26
|
|
//0x27
|
|
//0x28
|
|
//0x29
|
|
//0x2A
|
|
//0x2B
|
|
//0x2C
|
|
//0x2D
|
|
scancode_set.extended[0x2E] = Some(KeyCode::VolumeDown); // E02E
|
|
//0x2F
|
|
scancode_set.extended[0x30] = Some(KeyCode::VolumeUp); // E030
|
|
//0x31
|
|
scancode_set.extended[0x32] = Some(KeyCode::WWWHome); // E032
|
|
//0x33
|
|
//0x34
|
|
scancode_set.extended[0x35] = Some(KeyCode::NumpadSlash); // E035
|
|
//0x36
|
|
//0x37
|
|
scancode_set.extended[0x38] = Some(KeyCode::AltRight); // E038
|
|
//0x39
|
|
//0x3A
|
|
//0x3B
|
|
//0x3C
|
|
//0x3D
|
|
//0x3E
|
|
//0x3F
|
|
//0x40
|
|
//0x41
|
|
//0x42
|
|
//0x43
|
|
//0x44
|
|
//0x45
|
|
//0x46
|
|
scancode_set.extended[0x47] = Some(KeyCode::Home); // E047
|
|
scancode_set.extended[0x48] = Some(KeyCode::ArrowUp); // E048
|
|
scancode_set.extended[0x49] = Some(KeyCode::PageUp); // E049
|
|
//0x4A
|
|
scancode_set.extended[0x4B] = Some(KeyCode::ArrowLeft); // E04B
|
|
//0x4C
|
|
scancode_set.extended[0x4D] = Some(KeyCode::ArrowRight); // E04D
|
|
//0x4E
|
|
scancode_set.extended[0x4F] = Some(KeyCode::End); // E04F
|
|
scancode_set.extended[0x50] = Some(KeyCode::ArrowDown); // E050
|
|
scancode_set.extended[0x51] = Some(KeyCode::PageDown); // E051
|
|
scancode_set.extended[0x52] = Some(KeyCode::Insert); // E052
|
|
scancode_set.extended[0x53] = Some(KeyCode::Delete); // E053
|
|
for i in 0x90..=0xED {
|
|
scancode_set.extended[i] = scancode_set.extended[i - 0x80];
|
|
}
|
|
scancode_set
|
|
}
|
|
pub fn scancode_set2() -> Self {
|
|
Self {
|
|
single_byte: [None; 256],
|
|
extended: [None; 256],
|
|
}
|
|
}
|
|
}
|
|
impl ScancodeSet for CustomScanCodeSet {
|
|
fn advance_state(&self, state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error> {
|
|
match *state {
|
|
DecodeState::Start => {
|
|
match code {
|
|
EXTENDED_KEY_CODE => {
|
|
*state = DecodeState::Extended;
|
|
Ok(None)
|
|
}
|
|
0x80..=0xFF => {
|
|
// Release codes
|
|
Ok(Some(KeyEvent::new(
|
|
self.map_scancode(code - 0x80)?,
|
|
KeyState::Up,
|
|
)))
|
|
}
|
|
_ => {
|
|
// Normal codes
|
|
Ok(Some(KeyEvent::new(
|
|
self.map_scancode(code)?,
|
|
KeyState::Down,
|
|
)))
|
|
}
|
|
}
|
|
}
|
|
DecodeState::Extended => {
|
|
*state = DecodeState::Start;
|
|
match code {
|
|
0x80..=0xFF => {
|
|
// Extended Release codes
|
|
Ok(Some(KeyEvent::new(
|
|
self.map_extended_scancode(code - 0x80)?,
|
|
KeyState::Up,
|
|
)))
|
|
}
|
|
_ => {
|
|
// Normal release codes
|
|
Ok(Some(KeyEvent::new(
|
|
self.map_extended_scancode(code)?,
|
|
KeyState::Down,
|
|
)))
|
|
}
|
|
}
|
|
}
|
|
_ => {
|
|
// Can't get in to this state
|
|
unimplemented!();
|
|
}
|
|
}
|
|
}
|
|
fn map_scancode(&self, code: u8) -> Result<KeyCode, Error> {
|
|
if let Some(kc) = self.single_byte[code as usize] {
|
|
Ok(kc)
|
|
} else {
|
|
Err(Error::UnknownKeyCode)
|
|
}
|
|
}
|
|
fn map_extended_scancode(&self, code: u8) -> Result<KeyCode, Error> {
|
|
if let Some(kc) = self.extended[code as usize] {
|
|
Ok(kc)
|
|
} else {
|
|
Err(Error::UnknownKeyCode)
|
|
}
|
|
}
|
|
}
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub enum LayoutEntry {
|
|
Regular {
|
|
unshifted: Option<DecodedKey>,
|
|
shifted: Option<DecodedKey>,
|
|
altgr: Option<DecodedKey>,
|
|
raw_unicode: Option<DecodedKey>,
|
|
},
|
|
Numlockable {
|
|
unshifted: Option<DecodedKey>,
|
|
shifted: Option<DecodedKey>,
|
|
locked: Option<DecodedKey>,
|
|
locked_shifted: Option<DecodedKey>,
|
|
},
|
|
Capslockable {
|
|
unshifted: Option<DecodedKey>,
|
|
shifted: Option<DecodedKey>,
|
|
locked: Option<DecodedKey>,
|
|
locked_shifted: Option<DecodedKey>,
|
|
altgr: Option<DecodedKey>,
|
|
raw_unicode: Option<DecodedKey>,
|
|
},
|
|
}
|
|
// Do not edit this file directly. Instead, create a `Keyboard` and modify that.
|
|
pub struct CustomLayout {
|
|
mapping: [LayoutEntry; 256],
|
|
}
|
|
impl Default for CustomLayout {
|
|
fn default() -> Self {
|
|
Self::new_us104key()
|
|
}
|
|
}
|
|
impl CustomLayout {
|
|
#[rustfmt::skip]
|
|
pub fn new_us104key() -> Self {
|
|
let mut mapping = Self {
|
|
mapping: [LayoutEntry::Regular { unshifted: None, shifted: None, altgr: None, raw_unicode: None }; 256],
|
|
};
|
|
mapping.set_ab_c(KeyCode::BackTick, Some('`'.into()), Some('~'.into()), None);
|
|
mapping.set_aa_a(KeyCode::Escape, Some('\x1B'.into()));
|
|
mapping.set_ab_n(KeyCode::Key0, Some('0'.into()), Some(')'.into()));
|
|
mapping.set_ab_n(KeyCode::Key1, Some('1'.into()), Some('!'.into()));
|
|
mapping.set_ab_n(KeyCode::Key2, Some('2'.into()), Some('@'.into()));
|
|
mapping.set_ab_n(KeyCode::Key3, Some('3'.into()), Some('#'.into()));
|
|
mapping.set_ab_n(KeyCode::Key4, Some('4'.into()), Some('$'.into()));
|
|
mapping.set_ab_n(KeyCode::Key5, Some('5'.into()), Some('%'.into()));
|
|
mapping.set_ab_n(KeyCode::Key6, Some('6'.into()), Some('^'.into()));
|
|
mapping.set_ab_n(KeyCode::Key7, Some('7'.into()), Some('&'.into()));
|
|
mapping.set_ab_n(KeyCode::Key8, Some('8'.into()), Some('*'.into()));
|
|
mapping.set_ab_n(KeyCode::Key9, Some('9'.into()), Some('('.into()));
|
|
mapping.set_ab_n(KeyCode::Minus, Some('-'.into()), Some('_'.into()));
|
|
mapping.set_ab_n(KeyCode::Equals, Some('='.into()), Some('+'.into()));
|
|
mapping.set_aa_a(KeyCode::Backspace,Some('\x08'.into()));
|
|
mapping.set_aa_a(KeyCode::Tab,Some('\x09'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::Q, Some('q'.into()), Some('Q'.into()), Some('Q'.into()),Some('q'.into()), Some('\u{0011}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::W, Some('w'.into()), Some('W'.into()), Some('W'.into()),Some('w'.into()), Some('\u{0017}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::E, Some('e'.into()), Some('E'.into()), Some('E'.into()),Some('e'.into()), Some('\u{0005}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::R, Some('r'.into()), Some('R'.into()), Some('R'.into()),Some('r'.into()), Some('\u{0012}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::T, Some('t'.into()), Some('T'.into()), Some('T'.into()),Some('t'.into()), Some('\u{0014}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::Y, Some('y'.into()), Some('Y'.into()), Some('Y'.into()),Some('y'.into()), Some('\u{0019}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::U, Some('u'.into()), Some('U'.into()), Some('U'.into()),Some('u'.into()), Some('\u{0015}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::I, Some('i'.into()), Some('I'.into()), Some('I'.into()),Some('i'.into()), Some('\u{0009}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::O, Some('o'.into()), Some('O'.into()), Some('O'.into()),Some('o'.into()), Some('\u{000F}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::P, Some('p'.into()), Some('P'.into()), Some('P'.into()),Some('p'.into()), Some('\u{0010}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::A, Some('a'.into()), Some('A'.into()), Some('A'.into()),Some('a'.into()), Some('\u{0001}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::S, Some('s'.into()), Some('S'.into()), Some('S'.into()),Some('s'.into()), Some('\u{0013}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::D, Some('d'.into()), Some('D'.into()), Some('D'.into()),Some('d'.into()), Some('\u{0004}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::F, Some('f'.into()), Some('F'.into()), Some('F'.into()),Some('f'.into()), Some('\u{0006}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::G, Some('g'.into()), Some('G'.into()), Some('G'.into()),Some('g'.into()), Some('\u{0007}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::H, Some('h'.into()), Some('H'.into()), Some('H'.into()),Some('h'.into()), Some('\u{0008}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::J, Some('j'.into()), Some('J'.into()), Some('J'.into()),Some('j'.into()), Some('\u{000A}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::K, Some('k'.into()), Some('K'.into()), Some('K'.into()),Some('k'.into()), Some('\u{000B}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::L, Some('l'.into()), Some('L'.into()), Some('L'.into()),Some('l'.into()), Some('\u{000C}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::Z, Some('z'.into()), Some('Z'.into()), Some('Z'.into()),Some('z'.into()), Some('\u{001A}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::X, Some('x'.into()), Some('X'.into()), Some('X'.into()),Some('x'.into()), Some('\u{0018}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::C, Some('c'.into()), Some('C'.into()), Some('C'.into()),Some('c'.into()), Some('\u{0003}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::V, Some('v'.into()), Some('V'.into()), Some('V'.into()),Some('v'.into()), Some('\u{0016}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::B, Some('b'.into()), Some('B'.into()), Some('B'.into()),Some('b'.into()), Some('\u{0002}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::N, Some('n'.into()), Some('N'.into()), Some('N'.into()),Some('n'.into()), Some('\u{000E}'.into()));
|
|
mapping.set_abcd_e_letter(KeyCode::M, Some('m'.into()), Some('M'.into()), Some('M'.into()),Some('m'.into()), Some('\u{000D}'.into()));
|
|
mapping.set_ab_n(KeyCode::BracketSquareLeft, Some('{'.into()), Some('['.into()));
|
|
mapping.set_ab_n(KeyCode::BracketSquareRight, Some('}'.into()), Some(']'.into()));
|
|
mapping.set_ab_n(KeyCode::BackSlash, Some('|'.into()), Some('\\'.into()));
|
|
mapping.set_ab_n(KeyCode::SemiColon, Some(';'.into()), Some(':'.into()));
|
|
mapping.set_ab_n(KeyCode::Quote, Some('\''.into()), Some('"'.into()));
|
|
mapping.set_aa_a(KeyCode::Enter,Some('\x0A'.into()));
|
|
mapping.set_ab_n(KeyCode::Comma, Some(','.into()), Some('<'.into()));
|
|
mapping.set_ab_n(KeyCode::Fullstop, Some('.'.into()), Some('>'.into()));
|
|
mapping.set_ab_n(KeyCode::Slash, Some('/'.into()), Some('?'.into()));
|
|
mapping.set_aa_a(KeyCode::Spacebar,Some(' '.into()));
|
|
mapping.set_aa_a(KeyCode::Delete,Some('\x7F'.into()));
|
|
mapping.set_aaaa_num(KeyCode::NumpadSlash, Some('/'.into()), );
|
|
mapping.set_aaaa_num(KeyCode::NumpadStar, Some('*'.into()), );
|
|
mapping.set_aaaa_num(KeyCode::NumpadMinus, Some('-'.into()), );
|
|
mapping.set_abba_num(KeyCode::Numpad7, Some('7'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::Home as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad8, Some('8'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::ArrowUp as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad9, Some('9'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::PageUp as u32 }));
|
|
mapping.set_aaaa_num(KeyCode::NumpadPlus, Some('+'.into()));
|
|
mapping.set_abba_num(KeyCode::Numpad4, Some('4'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::ArrowLeft as u32 }));
|
|
mapping.set_aaaa_num(KeyCode::Numpad5, Some('5'.into()));
|
|
mapping.set_abba_num(KeyCode::Numpad6, Some('6'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::ArrowRight as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad1, Some('1'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::End as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad2, Some('2'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::ArrowDown as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad3, Some('3'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::PageDown as u32 }));
|
|
mapping.set_abba_num(KeyCode::Numpad0, Some('0'.into()), Some(DecodedKey{ kind: DecodedKeyKind::RawKey, value: KeyCode::Insert as u32 }));
|
|
mapping.set_abba_num(KeyCode::NumpadPeriod, Some('.'.into()), Some('\x7F'.into()));
|
|
mapping.set_aaaa_num(KeyCode::NumpadEnter, Some('\x0A'.into()));
|
|
mapping
|
|
}
|
|
#[rustfmt::skip]
|
|
pub fn new_us105key() -> Self {
|
|
let mut mapping = Self::new_us104key();
|
|
mapping.set_abcde(KeyCode::BackTick, Some('`'.into()), Some('¬'.into()), Some('|'.into()), None);
|
|
mapping.set_ab_n(KeyCode::Key2, Some('2'.into()), Some('"'.into()));
|
|
mapping.set_ab_n(KeyCode::Quote, Some('\''.into()), Some('@'.into()));
|
|
mapping.set_ab_n(KeyCode::Key3, Some('3'.into()), Some('£'.into()));
|
|
mapping.set_abcde(KeyCode::BackTick, Some('4'.into()), Some('$'.into()), Some('€'.into()), None);
|
|
mapping.set_ab_n(KeyCode::HashTilde, Some('#'.into()), Some('~'.into()));
|
|
mapping
|
|
}
|
|
}
|
|
impl KeyboardLayout for CustomLayout {
|
|
fn map_keycode(
|
|
&self,
|
|
keycode: KeyCode,
|
|
modifiers: &Modifiers,
|
|
handle_ctrl: HandleControl,
|
|
) -> DecodedKey {
|
|
let map_to_unicode = handle_ctrl == HandleControl::MapLettersToUnicode;
|
|
let spot = &self.mapping[keycode as usize];
|
|
if let Some(k) = if map_to_unicode && modifiers.is_ctrl() {
|
|
match spot {
|
|
LayoutEntry::Regular {
|
|
unshifted: _,
|
|
shifted: _,
|
|
altgr: _,
|
|
raw_unicode,
|
|
} => raw_unicode,
|
|
LayoutEntry::Numlockable {
|
|
unshifted: _,
|
|
shifted: _,
|
|
locked: _,
|
|
locked_shifted: _,
|
|
} => &None,
|
|
LayoutEntry::Capslockable {
|
|
unshifted: _,
|
|
shifted: _,
|
|
locked: _,
|
|
locked_shifted: _,
|
|
raw_unicode,
|
|
altgr: _,
|
|
} => raw_unicode,
|
|
}
|
|
} else if modifiers.alt_gr {
|
|
match spot {
|
|
LayoutEntry::Regular {
|
|
unshifted: _,
|
|
shifted: _,
|
|
altgr,
|
|
raw_unicode: _,
|
|
} => altgr,
|
|
LayoutEntry::Numlockable {
|
|
unshifted: _,
|
|
shifted: _,
|
|
locked: _,
|
|
locked_shifted: _,
|
|
} => &None,
|
|
LayoutEntry::Capslockable {
|
|
unshifted: _,
|
|
shifted: _,
|
|
locked: _,
|
|
locked_shifted: _,
|
|
raw_unicode: _,
|
|
altgr,
|
|
} => altgr,
|
|
}
|
|
} else if modifiers.is_shifted() {
|
|
match spot {
|
|
LayoutEntry::Regular {
|
|
unshifted: _,
|
|
shifted,
|
|
altgr: _,
|
|
raw_unicode: _,
|
|
} => shifted,
|
|
LayoutEntry::Numlockable {
|
|
unshifted: _,
|
|
shifted,
|
|
locked: _,
|
|
locked_shifted,
|
|
} => {
|
|
if modifiers.numlock {
|
|
locked_shifted
|
|
} else {
|
|
shifted
|
|
}
|
|
}
|
|
LayoutEntry::Capslockable {
|
|
unshifted: _,
|
|
shifted,
|
|
locked: _,
|
|
locked_shifted,
|
|
raw_unicode: _,
|
|
altgr: _,
|
|
} => {
|
|
if modifiers.is_caps() {
|
|
locked_shifted
|
|
} else {
|
|
shifted
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
match spot {
|
|
LayoutEntry::Regular {
|
|
unshifted,
|
|
shifted: _,
|
|
altgr: _,
|
|
raw_unicode: _,
|
|
} => unshifted,
|
|
LayoutEntry::Numlockable {
|
|
unshifted,
|
|
shifted: _,
|
|
locked,
|
|
locked_shifted: _,
|
|
} => {
|
|
if modifiers.numlock {
|
|
locked
|
|
} else {
|
|
unshifted
|
|
}
|
|
}
|
|
LayoutEntry::Capslockable {
|
|
unshifted,
|
|
shifted: _,
|
|
locked,
|
|
locked_shifted: _,
|
|
raw_unicode: _,
|
|
altgr: _,
|
|
} => {
|
|
if modifiers.is_caps() {
|
|
locked
|
|
} else {
|
|
unshifted
|
|
}
|
|
}
|
|
}
|
|
} {
|
|
*k
|
|
} else {
|
|
DecodedKey::RawKey(keycode as u8)
|
|
}
|
|
}
|
|
}
|
|
// Note(elfein) Not super hard to get right, but still- DO NOT TOUCH
|
|
impl CustomLayout {
|
|
pub fn set_abcde(
|
|
&mut self,
|
|
index: KeyCode,
|
|
a: Option<DecodedKey>,
|
|
b: Option<DecodedKey>,
|
|
c: Option<DecodedKey>,
|
|
d: Option<DecodedKey>,
|
|
) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Regular {
|
|
unshifted: a,
|
|
shifted: b,
|
|
altgr: c,
|
|
raw_unicode: d,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_ab_c(
|
|
&mut self,
|
|
index: KeyCode,
|
|
a: Option<DecodedKey>,
|
|
b: Option<DecodedKey>,
|
|
c: Option<DecodedKey>,
|
|
) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Regular {
|
|
unshifted: a,
|
|
shifted: b,
|
|
altgr: None,
|
|
raw_unicode: c,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_ab_n(&mut self, index: KeyCode, a: Option<DecodedKey>, b: Option<DecodedKey>) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Regular {
|
|
unshifted: a,
|
|
shifted: b,
|
|
altgr: None,
|
|
raw_unicode: None,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_aa_a(&mut self, index: KeyCode, a: Option<DecodedKey>) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Regular {
|
|
unshifted: a,
|
|
shifted: a,
|
|
altgr: None,
|
|
raw_unicode: a,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_abcdef_letter(
|
|
&mut self,
|
|
index: KeyCode,
|
|
a: Option<DecodedKey>,
|
|
b: Option<DecodedKey>,
|
|
c: Option<DecodedKey>,
|
|
d: Option<DecodedKey>,
|
|
e: Option<DecodedKey>,
|
|
f: Option<DecodedKey>,
|
|
) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Capslockable {
|
|
unshifted: a,
|
|
shifted: b,
|
|
altgr: c,
|
|
locked: d,
|
|
locked_shifted: e,
|
|
raw_unicode: f,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_abcd_e_letter(
|
|
&mut self,
|
|
index: KeyCode,
|
|
a: Option<DecodedKey>,
|
|
b: Option<DecodedKey>,
|
|
c: Option<DecodedKey>,
|
|
d: Option<DecodedKey>,
|
|
e: Option<DecodedKey>,
|
|
) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Capslockable {
|
|
unshifted: a,
|
|
shifted: b,
|
|
locked: c,
|
|
locked_shifted: d,
|
|
altgr: None,
|
|
raw_unicode: e,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_aaaa_num(&mut self, index: KeyCode, a: Option<DecodedKey>) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Numlockable {
|
|
unshifted: a,
|
|
shifted: a,
|
|
locked: a,
|
|
locked_shifted: a,
|
|
}
|
|
};
|
|
}
|
|
pub fn set_abba_num(&mut self, index: KeyCode, a: Option<DecodedKey>, b: Option<DecodedKey>) {
|
|
self.mapping[index as usize] = {
|
|
LayoutEntry::Numlockable {
|
|
unshifted: a,
|
|
shifted: b,
|
|
locked: b,
|
|
locked_shifted: a,
|
|
}
|
|
};
|
|
}
|
|
}
|