From 263a0fb5cf7fcfe8354c8c8a6d220039633da2d9 Mon Sep 17 00:00:00 2001 From: Jesse Weaver Date: Sun, 9 Oct 2022 08:14:54 -0600 Subject: [PATCH] Fix parsing of event types/modifiers with certain keys (#716) --- src/event/sys/unix/parse.rs | 39 +++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/event/sys/unix/parse.rs b/src/event/sys/unix/parse.rs index e5b245962..ea2b1b468 100644 --- a/src/event/sys/unix/parse.rs +++ b/src/event/sys/unix/parse.rs @@ -537,11 +537,16 @@ pub(crate) fn parse_csi_special_key_code(buffer: &[u8]) -> Result(&mut split)?; - let modifiers = if let Ok(modifier_mask) = next_parsed::(&mut split) { - parse_modifiers(modifier_mask) - } else { - KeyModifiers::NONE - }; + let (modifiers, kind, state) = + if let Ok((modifier_mask, kind_code)) = modifier_and_kind_parsed(&mut split) { + ( + parse_modifiers(modifier_mask), + parse_key_event_kind(kind_code), + parse_modifiers_to_state(modifier_mask), + ) + } else { + (KeyModifiers::NONE, KeyEventKind::Press, KeyEventState::NONE) + }; let keycode = match first { 1 | 7 => KeyCode::Home, @@ -558,7 +563,9 @@ pub(crate) fn parse_csi_special_key_code(buffer: &[u8]) -> Result return Err(could_not_parse_event_error()), }; - let input_event = Event::Key(KeyEvent::new(keycode, modifiers)); + let input_event = Event::Key(KeyEvent::new_with_kind_and_state( + keycode, modifiers, kind, state, + )); Ok(Some(InternalEvent::Event(input_event))) } @@ -1364,4 +1371,24 @@ mod tests { )))), ); } + + #[test] + fn test_parse_csi_numbered_escape_code_with_types() { + assert_eq!( + parse_event(b"\x1B[5;1:3~", false).unwrap(), + Some(InternalEvent::Event(Event::Key(KeyEvent::new_with_kind( + KeyCode::PageUp, + KeyModifiers::empty(), + KeyEventKind::Release, + )))), + ); + assert_eq!( + parse_event(b"\x1B[6;5:3~", false).unwrap(), + Some(InternalEvent::Event(Event::Key(KeyEvent::new_with_kind( + KeyCode::PageDown, + KeyModifiers::CONTROL, + KeyEventKind::Release, + )))), + ); + } }