From d0e38d0e557e470b7ceb89ba8686bd3de9c4d06e Mon Sep 17 00:00:00 2001 From: moparisthebest Date: Sat, 25 Sep 2021 01:36:50 -0400 Subject: [PATCH] Avoid index out of bounds on strange keys (Apple) --- src/keymapper.rs | 46 +++++++++------------------------------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/src/keymapper.rs b/src/keymapper.rs index 109fe8f..b599a30 100644 --- a/src/keymapper.rs +++ b/src/keymapper.rs @@ -215,7 +215,12 @@ pub fn send_event(&mut self, mut event: &mut E, device: &K) -> Result { self.key_state[device.caps_lock_code().into()] = !self.key_state[device.caps_lock_code().into()]; } } else { - self.key_state[event.code().into()] = value == KeyState::DOWN; + let idx = event.code().into(); + if idx >= KEY_MAX { + // oh well, send it directly then + return device.send(event); + } + self.key_state[idx] = value == KeyState::DOWN; } let mut switch_layout_keys_pressed = true; for layout_switch_key in self.switch_layout_keys.iter_mut() { @@ -250,42 +255,16 @@ pub fn send_event(&mut self, mut event: &mut E, device: &K) -> Result { const KEY_MAX: usize = 249; struct KeyMap + Copy> { - //keymap: Vec, keymap: [Key; KEY_MAX], } impl + Copy> KeyMap { pub fn new() -> Self { - //let mut keymap = [0u16; KEY_MAX]; - //let mut keymap : [Box; KEY_MAX] = [Box::new(NOOP); KEY_MAX]; - //let mut keymap : [Box; KEY_MAX] = [Box::new(0u16); KEY_MAX]; - let keymap: [Key; KEY_MAX] = [Key::Noop; KEY_MAX]; - /* - let mut keymap: Vec = Vec::with_capacity(KEY_MAX); - #[allow(unused_variables)] - for x in 0..KEY_MAX { - keymap.push(Key::Noop); - } - */ - // which is rustier - /* - for x in 0..KEY_MAX { - keymap[x as usize] = x as u16; - } - for (x, v) in keymap.iter_mut().enumerate() { - *v = x as u16; - } - */ - //println!("keymap: {:?}", &keymap[..]); KeyMap { - keymap: keymap + keymap: [Key::Noop; KEY_MAX] } } - /* - pub fn map(&mut self, from : u16, to: u16) { - self.keymap[from as usize] = to; - } - */ + pub fn map(&mut self, from: T, to: Key) { self.keymap[from.into()] = to; } @@ -303,25 +282,18 @@ impl KeyMapper for KeyMap } struct CodeKeyMap + TryFrom + Copy + Default> { - //keymap: Vec, keymap: [T; KEY_MAX], } impl + TryFrom + Copy + Default> CodeKeyMap { pub fn new() -> Self { let mut keymap = [T::default(); KEY_MAX]; - // which is rustier - /* - for x in 0..KEY_MAX { - keymap[x as usize] = x as u16; - } - */ for (x, v) in keymap.iter_mut().enumerate() { *v = T::try_from(x).unwrap_or_else(|_| panic!("cannot convert from usize to T ????")); } //println!("keymap: {:?}", &keymap[..]); CodeKeyMap { - keymap: keymap + keymap } }