summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2022-04-24 15:57:03 -0230
committerTim Oram <dev@mitmaro.ca>2022-04-24 21:45:51 -0230
commitb3912f5f95ee0b8c539c77913944d3bd4ce0cae0 (patch)
tree2f075832c12f68ef97648f084983ecb0e482158e
parent4a76e490e0f7c7108187a303b35aea3a65103a8c (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.rs14
-rw-r--r--src/input/src/key_bindings.rs24
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'))
+ ]);
+ }
}