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 }