aboutsummaryrefslogtreecommitdiff
path: root/src/client/input.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-19 22:23:49 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-19 22:24:20 +0300
commit052f20214b1be904924df8d50d01e31198098922 (patch)
tree209ec134a8dc7e90b0f141fa046b31cda835c85c /src/client/input.rs
parent46a2b259a71828e7fcdeab1f67ef675304e2ca14 (diff)
fix: preserve windows terminal multiline paste
refs #670
Diffstat (limited to 'src/client/input.rs')
-rw-r--r--src/client/input.rs22
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> {