summaryrefslogtreecommitdiffstats
path: root/wincolor/src/win.rs
diff options
context:
space:
mode:
Diffstat (limited to 'wincolor/src/win.rs')
-rw-r--r--wincolor/src/win.rs20
1 files changed, 13 insertions, 7 deletions
diff --git a/wincolor/src/win.rs b/wincolor/src/win.rs
index 43ccdcdd..9542704c 100644
--- a/wincolor/src/win.rs
+++ b/wincolor/src/win.rs
@@ -130,17 +130,23 @@ impl Console {
&mut self,
yes: bool,
) -> io::Result<()> {
- let mut lpmode = 0;
+ let vt = wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+
+ let mut old_mode = 0;
let handle = unsafe { processenv::GetStdHandle(self.handle_id) };
- if unsafe { consoleapi::GetConsoleMode(handle, &mut lpmode) } == 0 {
+ if unsafe { consoleapi::GetConsoleMode(handle, &mut old_mode) } == 0 {
return Err(io::Error::last_os_error());
}
- if yes {
- lpmode |= wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
- } else {
- lpmode &= !wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ let new_mode =
+ if yes {
+ old_mode | vt
+ } else {
+ old_mode & !vt
+ };
+ if old_mode == new_mode {
+ return Ok(());
}
- if unsafe { consoleapi::SetConsoleMode(handle, lpmode) } == 0 {
+ if unsafe { consoleapi::SetConsoleMode(handle, new_mode) } == 0 {
return Err(io::Error::last_os_error());
}
Ok(())