Add shift modifier to uppercase char events on unix (#423)
This commit is contained in:
parent
128eddeafc
commit
d4fc75cca1
@ -95,13 +95,22 @@ pub(crate) fn parse_event(buffer: &[u8], input_available: bool) -> Result<Option
|
|||||||
_ => parse_utf8_char(buffer).map(|maybe_char| {
|
_ => parse_utf8_char(buffer).map(|maybe_char| {
|
||||||
maybe_char
|
maybe_char
|
||||||
.map(KeyCode::Char)
|
.map(KeyCode::Char)
|
||||||
.map(Into::into)
|
.map(char_code_to_event)
|
||||||
.map(Event::Key)
|
.map(Event::Key)
|
||||||
.map(InternalEvent::Event)
|
.map(InternalEvent::Event)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// converts KeyCode to KeyEvent (adds shift modifier in case of uppercase characters)
|
||||||
|
fn char_code_to_event(code: KeyCode) -> KeyEvent {
|
||||||
|
let modifiers = match code {
|
||||||
|
KeyCode::Char(c) if c.is_uppercase() => KeyModifiers::SHIFT,
|
||||||
|
_ => KeyModifiers::empty(),
|
||||||
|
};
|
||||||
|
KeyEvent::new(code, modifiers)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_csi(buffer: &[u8]) -> Result<Option<InternalEvent>> {
|
pub(crate) fn parse_csi(buffer: &[u8]) -> Result<Option<InternalEvent>> {
|
||||||
assert!(buffer.starts_with(&[b'\x1B', b'['])); // ESC [
|
assert!(buffer.starts_with(&[b'\x1B', b'['])); // ESC [
|
||||||
|
|
||||||
@ -553,7 +562,10 @@ mod tests {
|
|||||||
// parse_utf8_char
|
// parse_utf8_char
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parse_event("Ž".as_bytes(), false).unwrap(),
|
parse_event("Ž".as_bytes(), false).unwrap(),
|
||||||
Some(InternalEvent::Event(Event::Key(KeyCode::Char('Ž').into()))),
|
Some(InternalEvent::Event(Event::Key(KeyEvent::new(
|
||||||
|
KeyCode::Char('Ž'),
|
||||||
|
KeyModifiers::SHIFT
|
||||||
|
)))),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -714,4 +726,26 @@ mod tests {
|
|||||||
// 'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
|
// 'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
|
||||||
assert!(parse_utf8_char(&[0xF0, 0x28, 0x8C, 0x28]).is_err());
|
assert!(parse_utf8_char(&[0xF0, 0x28, 0x8C, 0x28]).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_char_event_lowercase() {
|
||||||
|
assert_eq!(
|
||||||
|
parse_event("c".as_bytes(), false).unwrap(),
|
||||||
|
Some(InternalEvent::Event(Event::Key(KeyEvent::new(
|
||||||
|
KeyCode::Char('c'),
|
||||||
|
KeyModifiers::empty()
|
||||||
|
)))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_char_event_uppercase() {
|
||||||
|
assert_eq!(
|
||||||
|
parse_event("C".as_bytes(), false).unwrap(),
|
||||||
|
Some(InternalEvent::Event(Event::Key(KeyEvent::new(
|
||||||
|
KeyCode::Char('C'),
|
||||||
|
KeyModifiers::SHIFT
|
||||||
|
)))),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user