summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authormiere43 <x.miere@gmail.com>2016-06-26 16:01:37 +0300
committermiere43 <x.miere@gmail.com>2016-06-26 16:01:37 +0300
commit57bd50a9166fa4171071f88bc29f37f6d8959c11 (patch)
treec158a78979852c7585bfea29e8eda36eb098be0e /lib
parentdd7a24d8ccae7cf943fcb66133c51591fb2e719d (diff)
downloadNim-57bd50a9166fa4171071f88bc29f37f6d8959c11.tar.gz
Removed INPUT_KEY_RECORD
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/terminal.nim17
-rw-r--r--lib/windows/winlean.nim18
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