diff options
author | Tim Oram <dev@mitmaro.ca> | 2022-04-24 15:57:03 -0230 |
---|---|---|
committer | Tim Oram <dev@mitmaro.ca> | 2022-04-24 21:45:51 -0230 |
commit | b3912f5f95ee0b8c539c77913944d3bd4ce0cae0 (patch) | |
tree | 2f075832c12f68ef97648f084983ecb0e482158e | |
parent | 4a76e490e0f7c7108187a303b35aea3a65103a8c (diff) |
Remove shift from printable character events
Windows and *nix treat character events using the Shift modifier
differently. On Windows shift + ? includes the Shift modifier, but *nix
system do not. This ensures that any non-special event or keybinding
contains the shift modifier, it is removed.
-rw-r--r-- | src/input/src/event.rs | 14 | ||||
-rw-r--r-- | src/input/src/key_bindings.rs | 24 |
2 files changed, 31 insertions, 7 deletions
diff --git a/src/input/src/event.rs b/src/input/src/event.rs index 6d9b39f..6560d88 100644 --- a/src/input/src/event.rs +++ b/src/input/src/event.rs @@ -24,7 +24,12 @@ impl<CustomEvent: crate::CustomEvent> From<crossterm::event::Event> for Event<Cu #[inline] fn from(event: crossterm::event::Event) -> Self { match event { - crossterm::event::Event::Key(evt) => Self::Key(evt), + crossterm::event::Event::Key(mut evt) => { + if let KeyCode::Char(_) = evt.code { + evt.modifiers.remove(KeyModifiers::SHIFT); + } + Self::Key(evt) + }, crossterm::event::Event::Mouse(evt) => Self::Mouse(evt), crossterm::event::Event::Resize(width, height) => Self::Resize(width, height), } @@ -73,6 +78,13 @@ mod tests { } #[test] + fn from_crossterm_key_event_char_with_shift_modifier() { + let key_event = KeyEvent::new(KeyCode::Char('?'), KeyModifiers::SHIFT); + let event = Event::from(crossterm::event::Event::Key(key_event)); + assert_eq!(event, Event::Key(KeyEvent::from(KeyCode::Char('?')))); + } + + #[test] fn from_crossterm_mouse_event() { let mouse_event = MouseEvent { kind: MouseEventKind::Moved, diff --git a/src/input/src/key_bindings.rs b/src/input/src/key_bindings.rs index fe3fff3..b2d0913 100644 --- a/src/input/src/key_bindings.rs +++ b/src/input/src/key_bindings.rs @@ -74,7 +74,11 @@ pub fn map_keybindings<CustomEvent: crate::CustomEvent>(bindings: &[String]) -> let key_number = k[1..].parse::<u8>().unwrap_or(1); KeyCode::F(key_number) }, - k => KeyCode::Char(k.chars().next().expect("Expected only one character from Char KeyCode")), + k => { + // printable characters cannot use shift + modifiers.remove(KeyModifiers::SHIFT); + KeyCode::Char(k.chars().next().expect("Expected only one character from Char KeyCode")) + }, }; Event::Key(KeyEvent::new(code, modifiers)) }) @@ -118,12 +122,13 @@ mod tests { #[test] fn map_keybindings_with_modifiers() { - assert_eq!(map_keybindings::<TestEvent>(&[String::from("ControlAltShifta")]), vec![ - Event::Key(KeyEvent { - code: KeyCode::Char('a'), + assert_eq!( + map_keybindings::<TestEvent>(&[String::from("ControlAltShiftUp")]), + vec![Event::Key(KeyEvent { + code: KeyCode::Up, modifiers: KeyModifiers::all() - }) - ]); + })] + ); } #[rstest] @@ -150,4 +155,11 @@ mod tests { Event::from(key_code) ]); } + + #[test] + fn map_keybindings_key_code_char_remove_shift() { + assert_eq!(map_keybindings::<TestEvent>(&[String::from("ShiftA")]), vec![ + Event::from(KeyCode::Char('A')) + ]); + } } |