1 module scone.os.windows.input.windows_input;
2 
3 version (Windows)
4 {
5     import scone.input.os.standard_input : StandardInput;
6     import core.sys.windows.windows;
7     import scone.output.types.size : Size;
8     import scone.input.input : Input;
9     import scone.input.keyboard_event : KeyboardEvent;
10     import scone.input.scone_control_key : SCK;
11     import scone.input.scone_key : SK;
12     import scone.core.flags : hasFlag, withFlag;
13     import scone.input.os.windows.input.key_event_record_converter : KeyEventRecordConverter;
14     import std.conv : to;
15     import std.experimental.logger;
16 
17     class WindowsInput : StandardInput
18     {
19         void initialize()
20         {
21             consoleInputHandle = GetStdHandle(STD_INPUT_HANDLE);
22             if (consoleInputHandle == INVALID_HANDLE_VALUE)
23             {
24                 throw new Exception("Cannot initialize input. Got INVALID_HANDLE_VALUE.");
25             }
26         }
27 
28         void deinitialize()
29         {
30         }
31 
32         KeyboardEvent[] latestKeyboardEvents()
33         {
34             INPUT_RECORD[16] inputRecordBuffer;
35             DWORD read = 0;
36             ReadConsoleInput(consoleInputHandle, inputRecordBuffer.ptr, 16, &read);
37 
38             KeyboardEvent[] keyboardEvents;
39 
40             for (size_t e = 0; e < read; ++e)
41             {
42                 switch (inputRecordBuffer[e].EventType)
43                 {
44                 default:
45                     break;
46                 case  /* 0x0002 */ MOUSE_EVENT:
47                     // mouse has been clicked/moved
48                     break;
49                 case  /* 0x0004 */ WINDOW_BUFFER_SIZE_EVENT:
50                     /+ console has been resized
51                     COORD foo = inputRecordBuffer[e].WindowBufferSizeEvent.dwSize;
52                     Size newSize = Size(foo.X, foo.Y);
53                     +/
54                     break;
55                 case  /* 0x0001 */ KEY_EVENT:
56                     auto keyEventRecordConverter = new KeyEventRecordConverter(
57                             inputRecordBuffer[e].KeyEvent);
58                     keyboardEvents ~= KeyboardEvent(
59                             keyEventRecordConverter.sconeKey,
60                             keyEventRecordConverter.sconeControlKey,
61                             keyEventRecordConverter.pressed
62                     );
63                     break;
64                 }
65             }
66 
67             return keyboardEvents;
68         }
69 
70         private HANDLE consoleInputHandle;
71     }
72 }