Merge pull request #9 from Edmund-a7/master
fix: support IME input for Chinese and other UTF-8 characters
This commit is contained in:
commit
d739880f43
|
|
@ -309,19 +309,31 @@ fn kitty_modifier(mods: KeyModifiers) -> u32 {
|
|||
}
|
||||
|
||||
fn encode_text_input(key: &TerminalKey) -> Option<Vec<u8>> {
|
||||
let ch = match key.code {
|
||||
KeyCode::Char(ch) => ch,
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
if key.modifiers.is_empty() {
|
||||
match key.kind {
|
||||
crossterm::event::KeyEventKind::Press | crossterm::event::KeyEventKind::Repeat => {
|
||||
let mut buf = [0u8; 4];
|
||||
return Some(ch.encode_utf8(&mut buf).as_bytes().to_vec());
|
||||
}
|
||||
crossterm::event::KeyEventKind::Release => return Some(Vec::new()),
|
||||
}
|
||||
}
|
||||
|
||||
if key.modifiers != KeyModifiers::SHIFT {
|
||||
return None;
|
||||
}
|
||||
|
||||
let ch = match key.code {
|
||||
KeyCode::Char(ch) => shifted_text_char(key, ch)?,
|
||||
_ => return None,
|
||||
};
|
||||
let shifted_ch = shifted_text_char(key, ch)?;
|
||||
|
||||
match key.kind {
|
||||
crossterm::event::KeyEventKind::Press | crossterm::event::KeyEventKind::Repeat => {
|
||||
let mut buf = [0u8; 4];
|
||||
Some(ch.encode_utf8(&mut buf).as_bytes().to_vec())
|
||||
Some(shifted_ch.encode_utf8(&mut buf).as_bytes().to_vec())
|
||||
}
|
||||
crossterm::event::KeyEventKind::Release => Some(Vec::new()),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -720,3 +720,25 @@ fn protocol_from_nonzero_flags_is_kitty() {
|
|||
KeyboardProtocol::Kitty { flags: 7 }
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chinese_char_encodes_as_utf8() {
|
||||
let key = TerminalKey::new(KeyCode::Char('中'), KeyModifiers::empty());
|
||||
let encoded = encode_terminal_key(key, KeyboardProtocol::Legacy);
|
||||
assert_eq!(encoded, "中".as_bytes());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chinese_char_with_kitty_protocol_encodes_as_utf8() {
|
||||
let key = TerminalKey::new(KeyCode::Char('文'), KeyModifiers::empty());
|
||||
let encoded = encode_terminal_key(key, KeyboardProtocol::Kitty { flags: 7 });
|
||||
assert_eq!(encoded, "文".as_bytes());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chinese_char_with_modifiers_falls_back_to_kitty_encoding() {
|
||||
let key = TerminalKey::new(KeyCode::Char('测'), KeyModifiers::ALT);
|
||||
let encoded = encode_terminal_key(key, KeyboardProtocol::Kitty { flags: 7 });
|
||||
assert!(!encoded.is_empty());
|
||||
assert_ne!(encoded, "测".as_bytes());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -341,7 +341,6 @@ fn main() -> io::Result<()> {
|
|||
KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
|
||||
| KeyboardEnhancementFlags::REPORT_EVENT_TYPES
|
||||
| KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
|
||||
| KeyboardEnhancementFlags::REPORT_ALL_KEYS_AS_ESCAPE_CODES
|
||||
)
|
||||
)?;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue