From e7fc85bfdb51f89488430adbfe5bbced3be79c2f Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 23 Jul 2026 03:47:34 +0300 Subject: fix: preserve kitty printable key releases refs #1746 --- src/client/input/windows_vti.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'src/client/input/windows_vti.rs') 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 { 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) @@ -1219,6 +1225,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~"); @@ -1694,11 +1719,7 @@ mod tests { assert_eq!( translate(records), vec![ - crate::protocol::ClientInputEvent::Key { - code: crate::protocol::ClientKeyCode::Char('a'), - modifiers: 0, - kind: crate::protocol::ClientKeyKind::Press, - }, + crate::protocol::ClientInputEvent::Text { codepoint: 'a' }, crate::protocol::ClientInputEvent::Key { code: crate::protocol::ClientKeyCode::Char('a'), modifiers: 0, -- cgit v1.2.3