Auto merge of #125570 - tesuji:stdout-handle, r=Nilstrieb · model-checking/verify-rust-std@8981ee4 (original) (raw)
`@@ -22,6 +22,8 @@ type WORD = u16;
`
22
22
`type DWORD = u32;
`
23
23
`type BOOL = i32;
`
24
24
`type HANDLE = *mut u8;
`
``
25
`+
// https://docs.microsoft.com/en-us/windows/console/getstdhandle
`
``
26
`+
const STD_OUTPUT_HANDLE: DWORD = -11 as _;
`
25
27
``
26
28
`#[allow(non_snake_case)]
`
27
29
`#[repr(C)]
`
`@@ -99,16 +101,13 @@ impl<T: Write + Send + 'static> WinConsole {
`
99
101
` accum |= color_to_bits(self.background) << 4;
`
100
102
``
101
103
`unsafe {
`
102
``
`-
// Magic -11 means stdout, from
`
103
``
`-
// https://docs.microsoft.com/en-us/windows/console/getstdhandle
`
104
``
`-
//
`
105
104
`// You may be wondering, "but what about stderr?", and the answer
`
106
105
`// to that is that setting terminal attributes on the stdout
`
107
106
`// handle also sets them for stderr, since they go to the same
`
108
107
`// terminal! Admittedly, this is fragile, since stderr could be
`
109
108
`// redirected to a different console. This is good enough for
`
110
109
`// rustc though. See #13400.
`
111
``
`-
let out = GetStdHandle(-11i32 as DWORD);
`
``
110
`+
let out = GetStdHandle(STD_OUTPUT_HANDLE);
`
112
111
`SetConsoleTextAttribute(out, accum);
`
113
112
`}
`
114
113
`}
`
`@@ -120,9 +119,8 @@ impl<T: Write + Send + 'static> WinConsole {
`
120
119
`let bg;
`
121
120
`unsafe {
`
122
121
`let mut buffer_info = MaybeUninit::::uninit();
`
123
``
`-
if GetConsoleScreenBufferInfo(GetStdHandle(-11i32 as DWORD), buffer_info.as_mut_ptr())
`
124
``
`-
!= 0
`
125
``
`-
{
`
``
122
`+
let handle = GetStdHandle(STD_OUTPUT_HANDLE);
`
``
123
`+
if GetConsoleScreenBufferInfo(handle, buffer_info.as_mut_ptr()) != 0 {
`
126
124
`let buffer_info = buffer_info.assume_init();
`
127
125
` fg = bits_to_color(buffer_info.wAttributes);
`
128
126
` bg = bits_to_color(buffer_info.wAttributes >> 4);
`