diff options
-rw-r--r-- | lib/pure/terminal.nim | 17 | ||||
-rw-r--r-- | lib/windows/winlean.nim | 18 |
2 files changed, 14 insertions, 21 deletions
diff --git a/lib/pure/terminal.nim b/lib/pure/terminal.nim index 60fce04c9..62cee0ee8 100644 --- a/lib/pure/terminal.nim +++ b/lib/pure/terminal.nim @@ -498,20 +498,15 @@ proc getch*(): char = ## The character is not printed to the terminal. when defined(windows): let fd = getStdHandle(STD_INPUT_HANDLE) - # Block until character is entered - discard waitForSingleObject(fd, INFINITE) - var record = INPUT_RECORD() - var recordPtr: ptr INPUT_RECORD = addr(record) + var keyEvent = KEY_EVENT_RECORD() var numRead: cint while true: - discard readConsoleInput(fd, recordPtr, 1, addr(numRead)) - if numRead == 0 or record.eventType != 1: + # Block until character is entered + assert(waitForSingleObject(fd, INFINITE) == WAIT_OBJECT_0) + assert(readConsoleInput(fd, addr(keyEvent), 1, addr(numRead)) != 0) + if numRead == 0 or keyEvent.eventType != 1 or keyEvent.bKeyDown == 0: continue - let keyEvent = cast[ptr KEY_EVENT_RECORD](recordPtr) - # skip key release events - if keyEvent.bKeyDown == 0: - continue - return char(keyEvent.UnicodeChar) + return char(keyEvent.uChar) else: let fd = getFileHandle(stdin) var oldMode: Termios diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index 9d44621b9..b24a62b33 100644 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -1019,23 +1019,21 @@ proc wsaResetEvent*(hEvent: Handle): bool {.stdcall, importc: "WSAResetEvent", dynlib: "ws2_32.dll".} type - INPUT_RECORD* {.final, pure.} = object - eventType*: int16 - padding: array[18, byte] KEY_EVENT_RECORD* {.final, pure.} = object - eventType*: int16 + eventType*: uint16 + # padding: array[2, byte] bKeyDown*: WINBOOL - wRepeatCount*: int16 - wVirtualKeyCode*: int16 - wVirtualScanCode*: int16 - UnicodeChar*: int16 + wRepeatCount*: uint16 + wVirtualKeyCode*: uint16 + wVirtualScanCode*: uint16 + uChar*: uint16 dwControlKeyState*: DWORD when defined(useWinAnsi): proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint, lpNumberOfEventsRead: ptr cint): cint - {.header: "<windows.h>", importc: "ReadConsoleInputA".} + {.dynlib: "kernel32", importc: "ReadConsoleInputA".} else: proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint, lpNumberOfEventsRead: ptr cint): cint - {.header: "<windows.h>", importc: "ReadConsoleInputW".} \ No newline at end of file + {.dynlib: "kernel32", importc: "ReadConsoleInputW".} \ No newline at end of file |