Fail safely on Windows console mode errors
ci / test (push) Canceled after 0s
ci / fuzz-smoke (push) Canceled after 0s
ci / macos-client (macos-aarch64, macos-14) (push) Canceled after 0s
ci / macos-client (macos-x86_64, macos-13) (push) Canceled after 0s
ci / windows-client (push) Canceled after 0s
ci / package-release (linux-x86_64, ubuntu-latest, , , ) (push) Canceled after 0s
ci / package-release (macos-aarch64, macos-14, , , ) (push) Canceled after 0s
ci / package-release (macos-x86_64, macos-13, , , ) (push) Canceled after 0s
ci / package-release (windows-aarch64, windows-latest, aarch64, windows, aarch64-pc-windows-msvc) (push) Canceled after 0s
ci / package-release (windows-x86_64, windows-latest, , , ) (push) Canceled after 0s
ci / remote-bench (push) Canceled after 0s
ci / publish-gitea-release (push) Canceled after 0s

This commit is contained in:
DuProcess
2026-07-17 18:02:27 -04:00
parent 00a56fa53e
commit b88a347eba
+20 -7
View File
@@ -10565,9 +10565,17 @@ impl RawMode {
fn enter() -> Result<Self> { fn enter() -> Result<Self> {
flush_local_terminal_input(); flush_local_terminal_input();
enable_raw_mode()?; enable_raw_mode()?;
#[cfg(windows)]
let console_modes = match WindowsConsoleModeGuard::enter() {
Ok(guard) => guard,
Err(err) => {
let _ = disable_raw_mode();
return Err(err);
}
};
let raw = Self { let raw = Self {
#[cfg(windows)] #[cfg(windows)]
console_modes: WindowsConsoleModeGuard::enter(), console_modes,
}; };
flush_local_terminal_input(); flush_local_terminal_input();
drain_local_terminal_input(); drain_local_terminal_input();
@@ -10614,7 +10622,7 @@ struct WindowsConsoleModeGuard {
#[cfg(windows)] #[cfg(windows)]
impl WindowsConsoleModeGuard { impl WindowsConsoleModeGuard {
fn enter() -> Self { fn enter() -> Result<Self> {
unsafe { unsafe {
use windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE; use windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE;
use windows_sys::Win32::System::Console::{ use windows_sys::Win32::System::Console::{
@@ -10630,8 +10638,9 @@ impl WindowsConsoleModeGuard {
None None
} else { } else {
let desired = windows_vt_input_mode(original); let desired = windows_vt_input_mode(original);
if desired != original { if desired != original && SetConsoleMode(input_handle, desired) == 0 {
let _ = SetConsoleMode(input_handle, desired); return Err(std::io::Error::last_os_error())
.context("enable Windows virtual-terminal input mode");
} }
Some((input_handle, original)) Some((input_handle, original))
} }
@@ -10646,14 +10655,18 @@ impl WindowsConsoleModeGuard {
None None
} else { } else {
let desired = windows_vt_output_mode(original); let desired = windows_vt_output_mode(original);
if desired != original { if desired != original && SetConsoleMode(output_handle, desired) == 0 {
let _ = SetConsoleMode(output_handle, desired); let err = std::io::Error::last_os_error();
if let Some((handle, mode)) = input {
let _ = SetConsoleMode(handle, mode);
}
return Err(err).context("enable Windows virtual-terminal output mode");
} }
Some((output_handle, original)) Some((output_handle, original))
} }
}; };
Self { input, output } Ok(Self { input, output })
} }
} }