From 20c15dd7c8e516753a09e74d400b0637f5fd5682 Mon Sep 17 00:00:00 2001 From: JJ Liebig Date: Thu, 17 Sep 2026 00:07:58 +0200 Subject: fix(windows): preserve VT input during mouse refresh (#4257) refs #4251 --- src/client/terminal_setup.rs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'src/client/terminal_setup.rs') diff --git a/src/client/terminal_setup.rs b/src/client/terminal_setup.rs index 44f6fbaa..e42c5ec8 100644 --- a/src/client/terminal_setup.rs +++ b/src/client/terminal_setup.rs @@ -280,9 +280,15 @@ fn set_windows_native_mouse_capture( Ok(()) } +#[cfg(windows)] +fn windows_uses_vt_mouse_reporting() -> bool { + windows_vti_input_backend_enabled() + && (is_ssh_session() || crate::platform::windows_virtual_terminal_input_active()) +} + pub(super) fn set_mouse_capture(enabled: bool, sgr_pixels: bool) -> io::Result<()> { #[cfg(windows)] - if is_ssh_session() && windows_vti_input_backend_enabled() { + if windows_uses_vt_mouse_reporting() { crate::terminal_modes::clear_host_mouse_reporting(&mut io::stdout())?; return crate::terminal_modes::set_windows_mouse_reporting( &mut io::stdout(), @@ -295,11 +301,7 @@ pub(super) fn set_mouse_capture(enabled: bool, sgr_pixels: bool) -> io::Result<( if enabled { execute!(io::stdout(), EnableMouseCapture) } else { - match execute!(io::stdout(), DisableMouseCapture) { - Ok(()) => Ok(()), - Err(err) if err.to_string() == "Initial console modes not set" => Ok(()), - Err(err) => Err(err), - } + disable_windows_native_mouse_capture() } }); #[cfg(not(windows))] @@ -320,6 +322,15 @@ pub(super) fn set_mouse_capture(enabled: bool, sgr_pixels: bool) -> io::Result<( } } +#[cfg(windows)] +fn disable_windows_native_mouse_capture() -> io::Result<()> { + match execute!(io::stdout(), DisableMouseCapture) { + Ok(()) => Ok(()), + Err(err) if err.to_string() == "Initial console modes not set" => Ok(()), + Err(err) => Err(err), + } +} + fn restore_terminal_state_once( restore_claimed: &AtomicBool, reset_keyboard_enhancements: bool, @@ -368,6 +379,10 @@ fn restore_terminal_state( if let Some(mode) = restore_windows_input_mode { restore_windows_input_mode_value(mode); } + #[cfg(windows)] + if !is_ssh_session() { + let _ = disable_windows_native_mouse_capture(); + } let restore_result = ratatui::try_restore(); let postlude_result = -- cgit v1.2.3