diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-23 03:47:34 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-23 03:47:44 +0300 |
| commit | e7fc85bfdb51f89488430adbfe5bbced3be79c2f (patch) | |
| tree | c1c0324f28040c50d0075d6407bdf6ab14d1b8c0 /src/client/input/windows_vti.rs | |
| parent | 2a20e90a026936d0d5b96823d74e2e4fe13a166f (diff) | |
fix: preserve kitty printable key releases
refs #1746
Diffstat (limited to 'src/client/input/windows_vti.rs')
| -rw-r--r-- | src/client/input/windows_vti.rs | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/client/input/windows_vti.rs b/src/client/input/windows_vti.rs index 5742b825..8966112e 100644 --- a/src/client/input/windows_vti.rs +++ b/src/client/input/windows_vti.rs @@ -622,6 +622,12 @@ impl WindowsInputMapper { kind: crate::protocol::ClientKeyKind, ) -> Option<crate::protocol::ClientInputEvent> { let modifiers = windows_key_modifiers(key.control_key_state); + if key.virtual_key_code == 0 { + let codepoint = self.utf16_unit_to_char(key.unicode)?; + if !codepoint.is_control() { + return Some(crate::protocol::ClientInputEvent::Text { codepoint }); + } + } if modifiers.contains(crossterm::event::KeyModifiers::CONTROL) && key.unicode == 0x000a && (key.virtual_key_code == 0x4a || key.virtual_scan_code == 0x24) @@ -1220,6 +1226,25 @@ mod tests { } #[test] + fn vti_win32_input_mode_marks_ime_commit_as_text() { + for control_key_state in [0, 0x0010, 0x0008] { + let records = win32_input_mode_encoded_record(WindowsKeyRecord { + key_down: true, + repeat_count: 1, + virtual_key_code: 0, + virtual_scan_code: 0, + unicode: '你' as u16, + control_key_state, + }); + + assert_eq!( + translate(records), + vec![crate::protocol::ClientInputEvent::Text { codepoint: '你' }] + ); + } + } + + #[test] fn vti_win32_input_mode_decoded_paste_flag_clears_after_raw_completion() { let mut records = win32_input_mode_encoded_key_bytes(b"\x1b[200~"); records.extend("one\x1b[201~".chars().map(key_char)); @@ -1694,11 +1719,7 @@ mod tests { assert_eq!( translate(records), vec