Removed INPUT_KEY_RECORD

This commit is contained in:
miere43 2016-06-26 16:01:37 +03:00
commit 57bd50a916
2 changed files with 14 additions and 21 deletions

View file

@ -498,20 +498,15 @@ proc getch*(): char =
## The character is not printed to the terminal. ## The character is not printed to the terminal.
when defined(windows): when defined(windows):
let fd = getStdHandle(STD_INPUT_HANDLE) let fd = getStdHandle(STD_INPUT_HANDLE)
# Block until character is entered var keyEvent = KEY_EVENT_RECORD()
discard waitForSingleObject(fd, INFINITE)
var record = INPUT_RECORD()
var recordPtr: ptr INPUT_RECORD = addr(record)
var numRead: cint var numRead: cint
while true: while true:
discard readConsoleInput(fd, recordPtr, 1, addr(numRead)) # Block until character is entered
if numRead == 0 or record.eventType != 1: 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 continue
let keyEvent = cast[ptr KEY_EVENT_RECORD](recordPtr) return char(keyEvent.uChar)
# skip key release events
if keyEvent.bKeyDown == 0:
continue
return char(keyEvent.UnicodeChar)
else: else:
let fd = getFileHandle(stdin) let fd = getFileHandle(stdin)
var oldMode: Termios var oldMode: Termios

View file

@ -1019,23 +1019,21 @@ proc wsaResetEvent*(hEvent: Handle): bool
{.stdcall, importc: "WSAResetEvent", dynlib: "ws2_32.dll".} {.stdcall, importc: "WSAResetEvent", dynlib: "ws2_32.dll".}
type type
INPUT_RECORD* {.final, pure.} = object
eventType*: int16
padding: array[18, byte]
KEY_EVENT_RECORD* {.final, pure.} = object KEY_EVENT_RECORD* {.final, pure.} = object
eventType*: int16 eventType*: uint16
# padding: array[2, byte]
bKeyDown*: WINBOOL bKeyDown*: WINBOOL
wRepeatCount*: int16 wRepeatCount*: uint16
wVirtualKeyCode*: int16 wVirtualKeyCode*: uint16
wVirtualScanCode*: int16 wVirtualScanCode*: uint16
UnicodeChar*: int16 uChar*: uint16
dwControlKeyState*: DWORD dwControlKeyState*: DWORD
when defined(useWinAnsi): when defined(useWinAnsi):
proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint, proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint,
lpNumberOfEventsRead: ptr cint): cint lpNumberOfEventsRead: ptr cint): cint
{.header: "<windows.h>", importc: "ReadConsoleInputA".} {.dynlib: "kernel32", importc: "ReadConsoleInputA".}
else: else:
proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint, proc readConsoleInput*(hConsoleInput: Handle, lpBuffer: pointer, nLength: cint,
lpNumberOfEventsRead: ptr cint): cint lpNumberOfEventsRead: ptr cint): cint
{.header: "<windows.h>", importc: "ReadConsoleInputW".} {.dynlib: "kernel32", importc: "ReadConsoleInputW".}