diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-19 22:23:49 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-19 22:24:20 +0300 |
| commit | 052f20214b1be904924df8d50d01e31198098922 (patch) | |
| tree | 209ec134a8dc7e90b0f141fa046b31cda835c85c /src/client/input.rs | |
| parent | 46a2b259a71828e7fcdeab1f67ef675304e2ca14 (diff) | |
fix: preserve windows terminal multiline paste
refs #670
Diffstat (limited to 'src/client/input.rs')
| -rw-r--r-- | src/client/input.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/client/input.rs b/src/client/input.rs index ba1e353f..7cf69533 100644 --- a/src/client/input.rs +++ b/src/client/input.rs @@ -23,6 +23,9 @@ use tokio::sync::mpsc; use super::ClientLoopEvent; +#[cfg(any(windows, test))] +mod windows_vti; + // --------------------------------------------------------------------------- // Stdin reader thread // --------------------------------------------------------------------------- @@ -114,6 +117,23 @@ fn windows_stdin_reader_loop( event_tx: mpsc::Sender<ClientLoopEvent>, should_quit: &Arc<AtomicBool>, ) { + if !super::windows_vti_input_backend_enabled() { + windows_crossterm_reader_loop(event_tx, should_quit); + } else { + match windows_vti::console_input_handle() { + Ok(handle) if windows_vti::virtual_terminal_input_enabled(handle) => { + windows_vti::raw_console_reader_loop(handle, event_tx, should_quit); + } + _ => windows_crossterm_reader_loop(event_tx, should_quit), + } + } +} + +#[cfg(windows)] +fn windows_crossterm_reader_loop( + event_tx: mpsc::Sender<ClientLoopEvent>, + should_quit: &Arc<AtomicBool>, +) { let mut framer = crate::raw_input::RawInputFramer::default(); let mut raw_sequence_pending = false; @@ -254,7 +274,7 @@ fn send_windows_raw_events( .is_ok() } -#[cfg(windows)] +#[cfg(any(windows, test))] fn windows_client_input_event_from_raw( event: crate::raw_input::RawInputEvent, ) -> Option<crate::protocol::ClientInputEvent> { |
