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> {
flush_local_terminal_input();
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 {
#[cfg(windows)]
console_modes: WindowsConsoleModeGuard::enter(),
console_modes,
};
flush_local_terminal_input();
drain_local_terminal_input();
@@ -10614,7 +10622,7 @@ struct WindowsConsoleModeGuard {
#[cfg(windows)]
impl WindowsConsoleModeGuard {
fn enter() -> Self {
fn enter() -> Result<Self> {
unsafe {
use windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE;
use windows_sys::Win32::System::Console::{
@@ -10630,8 +10638,9 @@ impl WindowsConsoleModeGuard {
None
} else {
let desired = windows_vt_input_mode(original);
if desired != original {
let _ = SetConsoleMode(input_handle, desired);
if desired != original && SetConsoleMode(input_handle, desired) == 0 {
return Err(std::io::Error::last_os_error())
.context("enable Windows virtual-terminal input mode");
}
Some((input_handle, original))
}
@@ -10646,14 +10655,18 @@ impl WindowsConsoleModeGuard {
None
} else {
let desired = windows_vt_output_mode(original);
if desired != original {
let _ = SetConsoleMode(output_handle, desired);
if desired != original && SetConsoleMode(output_handle, desired) == 0 {
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))
}
};
Self { input, output }
Ok(Self { input, output })
}
}