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
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:
+20
-7
@@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user