Skip to content

Commit

Permalink
Reduce scope of unsafe
Browse files Browse the repository at this point in the history
  • Loading branch information
madsmtm committed Jan 7, 2025
1 parent b5983ce commit 133ae17
Showing 1 changed file with 29 additions and 31 deletions.
60 changes: 29 additions & 31 deletions src/control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,39 +35,37 @@ pub fn set_virtual_terminal(use_virtual: bool) -> Result<(), io::Error> {
STD_OUTPUT_HANDLE,
};

unsafe {
let handle = GetStdHandle(STD_OUTPUT_HANDLE);
if handle == INVALID_HANDLE_VALUE {
return Err(io::Error::last_os_error());
}
let handle = unsafe { GetStdHandle(STD_OUTPUT_HANDLE) };
if handle == INVALID_HANDLE_VALUE {
return Err(io::Error::last_os_error());
}

let mut original_mode = 0;
// Return value of 0 means that `GetConsoleMode` failed:
// https://learn.microsoft.com/en-us/windows/console/getconsolemode#return-value
if GetConsoleMode(handle, &mut original_mode) == 0 {
return Err(io::Error::last_os_error());
}
let mut original_mode = 0;
// Return value of 0 means that `GetConsoleMode` failed:
// https://learn.microsoft.com/en-us/windows/console/getconsolemode#return-value
if unsafe { GetConsoleMode(handle, &mut original_mode) } == 0 {
return Err(io::Error::last_os_error());
}

let enabled = original_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING
== ENABLE_VIRTUAL_TERMINAL_PROCESSING;

let ret = match (use_virtual, enabled) {
// not enabled, should be enabled
(true, false) => {
SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING | original_mode)
}
// already enabled, should be disabled
(false, true) => {
SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING ^ original_mode)
}
_ => 0,
};

// Return value of 0 means that `SetConsoleMode` failed:
// https://learn.microsoft.com/en-us/windows/console/setconsolemode#return-value
if ret == 0 {
return Err(io::Error::last_os_error());
}
let enabled =
original_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == ENABLE_VIRTUAL_TERMINAL_PROCESSING;

let ret = match (use_virtual, enabled) {
// not enabled, should be enabled
(true, false) => unsafe {
SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING | original_mode)
},
// already enabled, should be disabled
(false, true) => unsafe {
SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING ^ original_mode)
},
_ => 0,
};

// Return value of 0 means that `SetConsoleMode` failed:
// https://learn.microsoft.com/en-us/windows/console/setconsolemode#return-value
if ret == 0 {
return Err(io::Error::last_os_error());
}

Ok(())
Expand Down

0 comments on commit 133ae17

Please sign in to comment.