// FIXME (#13400): this is only a tiny fraction of the Windows console api
-extern crate libc;
-
use std::io;
use std::io::prelude::*;
-use crate::Attr;
use crate::color;
+use crate::Attr;
use crate::Terminal;
/// A Terminal implementation that uses the Win32 Console API.
background: color::Color,
}
+type SHORT = i16;
type WORD = u16;
type DWORD = u32;
type BOOL = i32;
type HANDLE = *mut u8;
+#[allow(non_snake_case)]
+#[repr(C)]
+struct SMALL_RECT {
+ Left: SHORT,
+ Top: SHORT,
+ Right: SHORT,
+ Bottom: SHORT,
+}
+
+#[allow(non_snake_case)]
+#[repr(C)]
+struct COORD {
+ X: SHORT,
+ Y: SHORT,
+}
+
#[allow(non_snake_case)]
#[repr(C)]
struct CONSOLE_SCREEN_BUFFER_INFO {
- dwSize: [libc::c_short; 2],
- dwCursorPosition: [libc::c_short; 2],
+ dwSize: COORD,
+ dwCursorPosition: COORD,
wAttributes: WORD,
- srWindow: [libc::c_short; 4],
- dwMaximumWindowSize: [libc::c_short; 2],
+ srWindow: SMALL_RECT,
+ dwMaximumWindowSize: COORD,
}
#[allow(non_snake_case)]
_ => unreachable!(),
};
- if color >= 8 {
- bits | 0x8
- } else {
- bits
- }
+ if color >= 8 { bits | 0x8 } else { bits }
}
fn bits_to_color(bits: u16) -> color::Color {
unsafe {
// Magic -11 means stdout, from
- // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx
+ // https://docs.microsoft.com/en-us/windows/console/getstdhandle
//
// You may be wondering, "but what about stderr?", and the answer
// to that is that setting terminal attributes on the stdout
/// Returns `None` whenever the terminal cannot be created for some reason.
pub fn new(out: T) -> io::Result<WinConsole<T>> {
+ use std::mem::MaybeUninit;
+
let fg;
let bg;
unsafe {
- #[allow(deprecated)]
- let mut buffer_info = ::std::mem::uninitialized();
- if GetConsoleScreenBufferInfo(GetStdHandle(-11i32 as DWORD), &mut buffer_info) != 0 {
+ let mut buffer_info = MaybeUninit::<CONSOLE_SCREEN_BUFFER_INFO>::uninit();
+ if GetConsoleScreenBufferInfo(GetStdHandle(-11i32 as DWORD), buffer_info.as_mut_ptr())
+ != 0
+ {
+ let buffer_info = buffer_info.assume_init();
fg = bits_to_color(buffer_info.wAttributes);
bg = bits_to_color(buffer_info.wAttributes >> 4);
} else {
}
fn into_inner(self) -> T
- where Self: Sized
+ where
+ Self: Sized,
{
self.buf
}