aboutsummaryrefslogtreecommitdiff
path: root/src/client/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/input.rs')
-rw-r--r--src/client/input.rs54
1 files changed, 45 insertions, 9 deletions
diff --git a/src/client/input.rs b/src/client/input.rs
index 28d38bda..09e0eb92 100644
--- a/src/client/input.rs
+++ b/src/client/input.rs
@@ -281,7 +281,16 @@ fn windows_crossterm_input_event(
code: crate::protocol::ClientKeyCode::Char(codepoint),
modifiers: 0,
kind: crate::protocol::ClientKeyKind::Press,
- } => Some(crate::protocol::ClientInputEvent::Text { codepoint }),
+ source,
+ ..
+ } => Some(crate::protocol::ClientInputEvent::Key {
+ code: crate::protocol::ClientKeyCode::Char(codepoint),
+ modifiers: 0,
+ kind: crate::protocol::ClientKeyKind::Press,
+ repeat_count: 1,
+ generated_text: Some(codepoint.to_string()),
+ source,
+ }),
event => Some(event),
}
}
@@ -368,20 +377,29 @@ fn windows_client_input_event_from_raw(
event: crate::raw_input::RawInputEvent,
) -> Option<crate::protocol::ClientInputEvent> {
match event {
- crate::raw_input::RawInputEvent::Key(key) if key.is_text_commit => {
- let crossterm::event::KeyCode::Char(codepoint) = key.code else {
- return None;
- };
- Some(crate::protocol::ClientInputEvent::Text { codepoint })
- }
+ crate::raw_input::RawInputEvent::Text(text) => Some(
+ crate::protocol::ClientInputEvent::TextCommit(text.into_string()),
+ ),
crate::raw_input::RawInputEvent::Key(key) => {
let code = crate::protocol::ClientKeyCode::from_crossterm(key.code)?;
let modifiers = key.modifiers.bits();
let kind = crate::protocol::ClientKeyKind::from_crossterm(key.kind);
+ let source = if let Some(bytes) = key.vt_bytes() {
+ crate::protocol::ClientKeySource::Vt {
+ bytes: bytes.to_vec(),
+ }
+ } else if let Some(record) = key.windows_record() {
+ crate::protocol::ClientKeySource::WindowsConsole { record }
+ } else {
+ crate::protocol::ClientKeySource::Synthesized
+ };
Some(crate::protocol::ClientInputEvent::Key {
code,
modifiers,
kind,
+ repeat_count: key.repeat_count,
+ generated_text: key.generated_text.clone(),
+ source,
})
}
crate::raw_input::RawInputEvent::Mouse(mouse) => {
@@ -573,12 +591,19 @@ mod windows_tests {
}
#[test]
- fn windows_crossterm_printable_press_is_text() {
+ fn windows_crossterm_printable_press_keeps_key_semantics_and_text() {
let event = Event::Key(KeyEvent::new(KeyCode::Char('你'), KeyModifiers::empty()));
assert_eq!(
windows_crossterm_input_event(event),
- Some(crate::protocol::ClientInputEvent::Text { codepoint: '你' })
+ Some(crate::protocol::ClientInputEvent::Key {
+ code: crate::protocol::ClientKeyCode::Char('你'),
+ modifiers: 0,
+ kind: crate::protocol::ClientKeyKind::Press,
+ repeat_count: 1,
+ generated_text: Some("你".to_string()),
+ source: crate::protocol::ClientKeySource::Synthesized,
+ })
);
}
@@ -673,6 +698,9 @@ mod windows_tests {
code: crate::protocol::ClientKeyCode::Char('d'),
modifiers: KeyModifiers::CONTROL.bits(),
kind: crate::protocol::ClientKeyKind::Press,
+ repeat_count: 1,
+ generated_text: None,
+ source: crate::protocol::ClientKeySource::Vt { bytes: vec![4] },
}
);
}
@@ -693,6 +721,11 @@ mod windows_tests {
code: crate::protocol::ClientKeyCode::Up,
modifiers: 0,
kind: crate::protocol::ClientKeyKind::Press,
+ repeat_count: 1,
+ generated_text: None,
+ source: crate::protocol::ClientKeySource::Vt {
+ bytes: b"\x1b[A".to_vec()
+ },
}
);
}
@@ -712,6 +745,9 @@ mod windows_tests {
code: crate::protocol::ClientKeyCode::Esc,
modifiers: 0,
kind: crate::protocol::ClientKeyKind::Press,
+ repeat_count: 1,
+ generated_text: None,
+ source: crate::protocol::ClientKeySource::Vt { bytes: vec![0x1b] },
}
);
}