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