From b76adc155d979705a353fd6dc87c702f9dfc6c22 Mon Sep 17 00:00:00 2001 From: Can Celik Date: Sat, 1 Aug 2026 04:27:50 +0300 Subject: fix(input): preserve native key lifecycle across routing (#2142) refs #2077 Co-authored-by: Jonathan Liebig --- src/input/encode.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/input/encode.rs') diff --git a/src/input/encode.rs b/src/input/encode.rs index cd59b0f4..c475e0da 100644 --- a/src/input/encode.rs +++ b/src/input/encode.rs @@ -16,8 +16,10 @@ pub fn encode_key(key: KeyEvent, protocol: KeyboardProtocol) -> Vec { } pub fn encode_terminal_key(key: TerminalKey, protocol: KeyboardProtocol) -> Vec { - if key.is_text_commit { - return encode_text_input(&key).unwrap_or_default(); + if key.kind != crossterm::event::KeyEventKind::Release { + if let Some(text) = &key.generated_text { + return text.as_bytes().to_vec(); + } } // A release event only produces bytes when the pane protocol reports event @@ -282,10 +284,7 @@ fn encode_legacy(key: TerminalKey) -> Vec { // Alt modifier on character keys: prefix with ESC if mods.contains(KeyModifiers::ALT) { - let inner = TerminalKey { - modifiers: mods.difference(KeyModifiers::ALT), - ..key - }; + let inner = key.with_modifiers(mods.difference(KeyModifiers::ALT)); let mut bytes = vec![0x1b]; bytes.extend(encode_legacy_inner(inner)); return bytes; @@ -950,6 +949,13 @@ mod tests { encode_key(release, KeyboardProtocol::Kitty { flags: 3 }), b"\x1b[106;1:3u" ); + + let mut malformed_release = TerminalKey::from(release); + malformed_release.generated_text = Some("j".to_owned()); + assert_eq!( + encode_terminal_key(malformed_release, KeyboardProtocol::Kitty { flags: 3 }), + b"\x1b[106;1:3u" + ); } #[test] -- cgit v1.2.3