diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-08-01 04:27:50 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-01 04:27:50 +0300 |
| commit | b76adc155d979705a353fd6dc87c702f9dfc6c22 (patch) | |
| tree | f613254e0cfbfd2b4450a6a5f3ee7c0ba8136976 /src/input/encode.rs | |
| parent | 8d190eddda2c74afa3dc043f8ec8020ffd7b5a94 (diff) | |
fix(input): preserve native key lifecycle across routing (#2142)
refs #2077
Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
Diffstat (limited to 'src/input/encode.rs')
| -rw-r--r-- | src/input/encode.rs | 18 |
1 files changed, 12 insertions, 6 deletions
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<u8> { } pub fn encode_terminal_key(key: TerminalKey, protocol: KeyboardProtocol) -> Vec<u8> { - 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<u8> { // 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] |
