1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source: $(DRUNTIMESRC src/core/sys/windows/_wincon.d)
8  */
9 module core.sys.windows.wincon;
version(Windows)10 version (Windows):
11 @system:
12 
13 version (ANSI) {} else version = Unicode;
14 pragma(lib, "kernel32");
15 
16 import core.sys.windows.w32api, core.sys.windows.windef;
17 
18 // FIXME: clean up Windows version support
19 
20 enum {
21     FOREGROUND_BLUE             = 0x0001,
22     FOREGROUND_GREEN            = 0x0002,
23     FOREGROUND_RED              = 0x0004,
24     FOREGROUND_INTENSITY        = 0x0008,
25     BACKGROUND_BLUE             = 0x0010,
26     BACKGROUND_GREEN            = 0x0020,
27     BACKGROUND_RED              = 0x0040,
28     BACKGROUND_INTENSITY        = 0x0080,
29 
30     COMMON_LVB_LEADING_BYTE     = 0x0100,
31     COMMON_LVB_TRAILING_BYTE    = 0x0200,
32     COMMON_LVB_GRID_HORIZONTAL  = 0x0400,
33     COMMON_LVB_GRID_LVERTICAL   = 0x0800,
34     COMMON_LVB_GRID_RVERTICAL   = 0x1000,
35     COMMON_LVB_REVERSE_VIDEO    = 0x4000,
36     COMMON_LVB_UNDERSCORE       = 0x8000,
37 
38     COMMON_LVB_SBCSDBCS         = 0x0300,
39 }
40 
41 static if (_WIN32_WINNT >= 0x501) {
42     enum {
43         CONSOLE_FULLSCREEN_MODE = 1,
44         CONSOLE_WINDOWED_MODE   = 0
45     }
46 }
47 
48 enum {
49     CTRL_C_EVENT        = 0,
50     CTRL_BREAK_EVENT    = 1,
51     CTRL_CLOSE_EVENT    = 2,
52     CTRL_LOGOFF_EVENT   = 5,
53     CTRL_SHUTDOWN_EVENT = 6
54 }
55 
56 enum {
57     ENABLE_PROCESSED_INPUT        = 1,
58     ENABLE_LINE_INPUT             = 2,
59     ENABLE_ECHO_INPUT             = 4,
60     ENABLE_WINDOW_INPUT           = 8,
61     ENABLE_MOUSE_INPUT            = 16,
62     ENABLE_INSERT_MODE            = 32,
63     ENABLE_QUICK_EDIT_MODE        = 64,
64     ENABLE_EXTENDED_FLAGS         = 128,
65     ENABLE_AUTO_POSITION          = 256,
66     ENABLE_VIRTUAL_TERMINAL_INPUT = 512
67 }
68 
69 enum {
70     ENABLE_PROCESSED_OUTPUT            = 1,
71     ENABLE_WRAP_AT_EOL_OUTPUT          = 2,
72     ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4,
73     DISABLE_NEWLINE_AUTO_RETURN        = 8,
74     ENABLE_LVB_GRID_WORLDWIDE          = 16
75 }
76 
77 enum {
78     KEY_EVENT                 = 1,
79     MOUSE_EVENT               = 2,
80     WINDOW_BUFFER_SIZE_EVENT  = 4,
81     MENU_EVENT                = 8,
82     FOCUS_EVENT               = 16
83 }
84 enum {
85     RIGHT_ALT_PRESSED  = 1,
86     LEFT_ALT_PRESSED   = 2,
87     RIGHT_CTRL_PRESSED = 4,
88     LEFT_CTRL_PRESSED  = 8,
89     SHIFT_PRESSED      = 16,
90     NUMLOCK_ON         = 32,
91     SCROLLLOCK_ON      = 64,
92     CAPSLOCK_ON        = 128,
93     ENHANCED_KEY       = 256
94 }
95 enum {
96     FROM_LEFT_1ST_BUTTON_PRESSED  = 1,
97     RIGHTMOST_BUTTON_PRESSED      = 2,
98     FROM_LEFT_2ND_BUTTON_PRESSED  = 4,
99     FROM_LEFT_3RD_BUTTON_PRESSED  = 8,
100     FROM_LEFT_4TH_BUTTON_PRESSED  = 16
101 }
102 
103 enum {
104     MOUSE_MOVED   = 1,
105     DOUBLE_CLICK  = 2,
106     MOUSE_WHEELED = 4
107 }
108 
109 struct CHAR_INFO {
110     union _Char {
111         WCHAR UnicodeChar = 0;
112         CHAR AsciiChar;
113     }
114     union {
115         _Char Char;
116         WCHAR UnicodeChar;
117         CHAR AsciiChar;
118     }
119     WORD Attributes;
120 }
121 alias CHAR_INFO* PCHAR_INFO;
122 
123 struct SMALL_RECT {
124     SHORT Left;
125     SHORT Top;
126     SHORT Right;
127     SHORT Bottom;
128 }
129 alias SMALL_RECT* PSMALL_RECT;
130 
131 struct CONSOLE_CURSOR_INFO {
132     DWORD dwSize;
133     BOOL  bVisible;
134 }
135 alias CONSOLE_CURSOR_INFO* PCONSOLE_CURSOR_INFO;
136 
137 struct COORD {
138     SHORT X;
139     SHORT Y;
140 }
141 alias COORD* PCOORD;
142 
143 struct CONSOLE_FONT_INFO {
144     DWORD nFont;
145     COORD dwFontSize;
146 }
147 alias CONSOLE_FONT_INFO* PCONSOLE_FONT_INFO;
148 
149 struct CONSOLE_SCREEN_BUFFER_INFO {
150     COORD      dwSize;
151     COORD      dwCursorPosition;
152     WORD       wAttributes;
153     SMALL_RECT srWindow;
154     COORD      dwMaximumWindowSize;
155 }
156 alias CONSOLE_SCREEN_BUFFER_INFO* PCONSOLE_SCREEN_BUFFER_INFO;
157 
158 alias extern(Windows) BOOL function(DWORD) nothrow PHANDLER_ROUTINE;
159 
160 struct KEY_EVENT_RECORD {
161     BOOL  bKeyDown;
162     WORD  wRepeatCount;
163     WORD  wVirtualKeyCode;
164     WORD  wVirtualScanCode;
165     union _uChar {
166         WCHAR UnicodeChar = 0;
167         CHAR  AsciiChar;
168     }
169     union {
170         WCHAR UnicodeChar = 0;
171         CHAR  AsciiChar;
172         _uChar uChar;
173     }
174     DWORD dwControlKeyState;
175 }
176 alias KEY_EVENT_RECORD* PKEY_EVENT_RECORD;
177 
178 struct MOUSE_EVENT_RECORD {
179     COORD dwMousePosition;
180     DWORD dwButtonState;
181     DWORD dwControlKeyState;
182     DWORD dwEventFlags;
183 }
184 alias MOUSE_EVENT_RECORD* PMOUSE_EVENT_RECORD;
185 
186 struct WINDOW_BUFFER_SIZE_RECORD {
187     COORD dwSize;
188 }
189 alias WINDOW_BUFFER_SIZE_RECORD* PWINDOW_BUFFER_SIZE_RECORD;
190 
191 struct MENU_EVENT_RECORD {
192     UINT dwCommandId;
193 }
194 alias MENU_EVENT_RECORD* PMENU_EVENT_RECORD;
195 
196 struct FOCUS_EVENT_RECORD {
197     BOOL bSetFocus;
198 }
199 alias FOCUS_EVENT_RECORD* PFOCUS_EVENT_RECORD;
200 
201 struct INPUT_RECORD {
202     WORD EventType;
203     union _Event {
204         KEY_EVENT_RECORD KeyEvent;
205         MOUSE_EVENT_RECORD MouseEvent;
206         WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
207         MENU_EVENT_RECORD MenuEvent;
208         FOCUS_EVENT_RECORD FocusEvent;
209     }
210     union {
211         KEY_EVENT_RECORD KeyEvent;
212         MOUSE_EVENT_RECORD MouseEvent;
213         WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
214         MENU_EVENT_RECORD MenuEvent;
215         FOCUS_EVENT_RECORD FocusEvent;
216         _Event Event;
217     }
218 }
219 alias INPUT_RECORD* PINPUT_RECORD;
220 
221 extern (Windows) nothrow @nogc:
222 
223 BOOL AllocConsole();
224 HANDLE CreateConsoleScreenBuffer(DWORD, DWORD, const(SECURITY_ATTRIBUTES)*, DWORD, LPVOID);
225 BOOL FillConsoleOutputAttribute(HANDLE, WORD, DWORD, COORD, PDWORD);
226 BOOL FillConsoleOutputCharacterA(HANDLE, CHAR, DWORD, COORD, PDWORD);
227 BOOL FillConsoleOutputCharacterW(HANDLE, WCHAR, DWORD, COORD, PDWORD);
228 BOOL FlushConsoleInputBuffer(HANDLE);
229 BOOL FreeConsole();
230 BOOL GenerateConsoleCtrlEvent(DWORD, DWORD);
231 UINT GetConsoleCP();
232 BOOL GetConsoleCursorInfo(HANDLE, PCONSOLE_CURSOR_INFO);
233 BOOL GetConsoleMode(HANDLE,PDWORD);
234 UINT GetConsoleOutputCP();
235 BOOL GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO);
236 DWORD GetConsoleTitleA(LPSTR, DWORD);
237 DWORD GetConsoleTitleW(LPWSTR, DWORD);
238 COORD GetLargestConsoleWindowSize(HANDLE);
239 BOOL GetNumberOfConsoleInputEvents(HANDLE, PDWORD);
240 BOOL GetNumberOfConsoleMouseButtons(PDWORD);
241 BOOL PeekConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
242 BOOL PeekConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
243 BOOL ReadConsoleA(HANDLE, PVOID, DWORD, PDWORD, PVOID);
244 BOOL ReadConsoleW(HANDLE, PVOID, DWORD, PDWORD, PVOID);
245 BOOL ReadConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
246 BOOL ReadConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
247 BOOL ReadConsoleOutputAttribute(HANDLE, LPWORD, DWORD, COORD, LPDWORD);
248 BOOL ReadConsoleOutputCharacterA(HANDLE, LPSTR, DWORD, COORD, PDWORD);
249 BOOL ReadConsoleOutputCharacterW(HANDLE, LPWSTR, DWORD, COORD, PDWORD);
250 BOOL ReadConsoleOutputA(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT);
251 BOOL ReadConsoleOutputW(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT);
252 BOOL ScrollConsoleScreenBufferA(HANDLE, const(SMALL_RECT)*, const(SMALL_RECT)*, COORD, const(CHAR_INFO)*);
253 BOOL ScrollConsoleScreenBufferW(HANDLE, const(SMALL_RECT)*, const(SMALL_RECT)*, COORD, const(CHAR_INFO)*);
254 BOOL SetConsoleActiveScreenBuffer(HANDLE);
255 BOOL SetConsoleCP(UINT);
256 BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE, BOOL);
257 BOOL SetConsoleCursorInfo(HANDLE, const(CONSOLE_CURSOR_INFO)*);
258 BOOL SetConsoleCursorPosition(HANDLE, COORD);
259 
260 
261 static if (_WIN32_WINNT >= 0x500) {
262 BOOL GetConsoleDisplayMode(LPDWORD);
263 HWND GetConsoleWindow();
264 }
265 
266 static if (_WIN32_WINNT >= 0x501) {
267 BOOL AttachConsole(DWORD);
268 BOOL SetConsoleDisplayMode(HANDLE, DWORD, PCOORD);
269 enum DWORD ATTACH_PARENT_PROCESS = cast(DWORD)-1;
270 }
271 
272 BOOL SetConsoleMode(HANDLE, DWORD);
273 BOOL SetConsoleOutputCP(UINT);
274 BOOL SetConsoleScreenBufferSize(HANDLE, COORD);
275 BOOL SetConsoleTextAttribute(HANDLE, WORD);
276 BOOL SetConsoleTitleA(LPCSTR);
277 BOOL SetConsoleTitleW(LPCWSTR);
278 BOOL SetConsoleWindowInfo(HANDLE, BOOL, const(SMALL_RECT)*);
279 BOOL WriteConsoleA(HANDLE, PCVOID, DWORD, PDWORD, PVOID);
280 BOOL WriteConsoleW(HANDLE, PCVOID, DWORD, PDWORD, PVOID);
281 BOOL WriteConsoleInputA(HANDLE, const(INPUT_RECORD)*, DWORD, PDWORD);
282 BOOL WriteConsoleInputW(HANDLE, const(INPUT_RECORD)*, DWORD, PDWORD);
283 BOOL WriteConsoleOutputA(HANDLE, const(CHAR_INFO)*, COORD, COORD, PSMALL_RECT);
284 BOOL WriteConsoleOutputW(HANDLE, const(CHAR_INFO)*, COORD, COORD, PSMALL_RECT);
285 BOOL WriteConsoleOutputAttribute(HANDLE, const(WORD)*, DWORD, COORD, PDWORD);
286 BOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, PDWORD);
287 BOOL WriteConsoleOutputCharacterW(HANDLE, LPCWSTR, DWORD, COORD, PDWORD);
288 
289 version (Unicode) {
290     alias FillConsoleOutputCharacterW FillConsoleOutputCharacter;
291     alias GetConsoleTitleW GetConsoleTitle;
292     alias PeekConsoleInputW PeekConsoleInput;
293     alias ReadConsoleW ReadConsole;
294     alias ReadConsoleInputW ReadConsoleInput;
295     alias ReadConsoleOutputW ReadConsoleOutput;
296     alias ReadConsoleOutputCharacterW ReadConsoleOutputCharacter;
297     alias ScrollConsoleScreenBufferW ScrollConsoleScreenBuffer;
298     alias SetConsoleTitleW SetConsoleTitle;
299     alias WriteConsoleW WriteConsole;
300     alias WriteConsoleInputW WriteConsoleInput;
301     alias WriteConsoleOutputW WriteConsoleOutput;
302     alias WriteConsoleOutputCharacterW WriteConsoleOutputCharacter;
303 } else {
304     alias FillConsoleOutputCharacterA FillConsoleOutputCharacter;
305     alias GetConsoleTitleA GetConsoleTitle;
306     alias PeekConsoleInputA PeekConsoleInput;
307     alias ReadConsoleA ReadConsole;
308     alias ReadConsoleInputA ReadConsoleInput;
309     alias ReadConsoleOutputA ReadConsoleOutput;
310     alias ReadConsoleOutputCharacterA ReadConsoleOutputCharacter;
311     alias ScrollConsoleScreenBufferA ScrollConsoleScreenBuffer;
312     alias SetConsoleTitleA SetConsoleTitle;
313     alias WriteConsoleA WriteConsole;
314     alias WriteConsoleInputA WriteConsoleInput;
315     alias WriteConsoleOutputA WriteConsoleOutput;
316     alias WriteConsoleOutputCharacterA WriteConsoleOutputCharacter;
317 }
318