thegame/src/utils/os/windows.rs

68 lines
2.3 KiB
Rust

#[cfg(target_os = "windows")]
pub fn move_cursor(x: u16, y: u16) {
{
use std::io::{self, Write};
use std::os::windows::io::AsRawHandle;
use winapi::um::wincon::{SetConsoleCursorPosition, COORD};
let stdout = io::stdout();
let handle = stdout.as_raw_handle();
let coord = COORD { X: x as i16, Y: y as i16 };
unsafe {
SetConsoleCursorPosition(handle, coord);
}
}
}
#[cfg(target_os = "windows")]
pub fn clear_console() {
{
use std::io::{self, Write};
use winapi::um::wincon::{GetConsoleScreenBufferInfo, COORD, CONSOLE_SCREEN_BUFFER_INFO, FillConsoleOutputCharacterA, FillConsoleOutputAttribute};
use winapi::um::winbase::GetStdHandle;
use winapi::um::winnt::STD_OUTPUT_HANDLE;
let stdout = io::stdout();
let handle = unsafe { GetStdHandle(STD_OUTPUT_HANDLE) };
let mut csbi: CONSOLE_SCREEN_BUFFER_INFO = unsafe { std::mem::zeroed() };
unsafe {
GetConsoleScreenBufferInfo(handle, &mut csbi);
let size = csbi.dwSize;
let coord = COORD { X: 0, Y: 0 };
FillConsoleOutputCharacterA(handle, b' ' as u8, (size.X * size.Y) as u32, coord, std::ptr::null_mut());
FillConsoleOutputAttribute(handle, csbi.wAttributes, (size.X * size.Y) as u32, coord, std::ptr::null_mut());
SetConsoleCursorPosition(handle, coord);
}
}
}
#[cfg(target_os = "windows")]
pub fn set_terminal_title(title: &str) {
use std::io::{self, Write};
use winapi::um::wincon::SetConsoleTitleA;
let title_bytes = title.as_bytes();
let c_title = std::ffi::CString::new(title_bytes).unwrap();
unsafe {
SetConsoleTitleA(c_title.as_ptr());
}
}
#[cfg(target_os = "windows")]
pub fn set_cursor_visibility(enable: bool) {
use std::io::{self, Write};
use winapi::um::wincon::{SetConsoleCursorInfo, CONSOLE_CURSOR_INFO};
let stdout = io::stdout();
let handle = stdout.as_raw_handle();
let mut cursor_info: CONSOLE_CURSOR_INFO = unsafe { std::mem::zeroed() };
unsafe {
SetConsoleCursorInfo(handle, &mut cursor_info);
cursor_info.bVisible = if enable { 1 } else { 0 };
SetConsoleCursorInfo(handle, &cursor_info);
}
}