From 02c74516922731282d5b81cafd154bff86eec578 Mon Sep 17 00:00:00 2001 From: Joey Payne Date: Sat, 18 Jun 2016 12:50:01 -0600 Subject: [PATCH] Add missing utils module --- utils.nim | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 utils.nim diff --git a/utils.nim b/utils.nim new file mode 100644 index 0000000..cff5001 --- /dev/null +++ b/utils.nim @@ -0,0 +1,65 @@ +when defined(windows): + import winlean + type + SHORT = int16 + COORD = object + X: SHORT + Y: SHORT + + SMALL_RECT = object + Left: SHORT + Top: SHORT + Right: SHORT + Bottom: SHORT + + CONSOLE_SCREEN_BUFFER_INFO = object + dwSize: COORD + dwCursorPosition: COORD + wAttributes: int16 + srWindow: SMALL_RECT + dwMaximumWindowSize: COORD + + proc getConsoleScreenBufferInfo(hConsoleOutput: HANDLE, + lpConsoleScreenBufferInfo: ptr CONSOLE_SCREEN_BUFFER_INFO): WINBOOL{.stdcall, + dynlib: "kernel32", importc: "GetConsoleScreenBufferInfo".} + + proc getTermSize*(): (int, int) = + let handle = getStdHandle(STD_OUTPUT_HANDLE) + var scrbuf: CONSOLE_SCREEN_BUFFER_INFO + let ret = getConsoleScreenBufferInfo(handle, addr(scrbuf)) + + if ret == -1: + return (-1, -1) + + let cols = scrbuf.srWindow.Right - scrbuf.srWindow.Left + 1 + let rows = scrbuf.srWindow.Bottom - scrbuf.srWindow.Top + 1 + + return (rows.int, cols.int) + +else: + import posix + type + winsize = object + ws_row: cushort + ws_col: cushort + ws_xpixel: cushort + ws_ypixel: cushort + + let + IOC_OUT = 0x40000000 + IOCPARM_MASK = 0x1fff + + var + TIOCGWINSZ{.importc: "TIOCGWINSZ", header: "".}: uint + + proc ioctl*(f: int, device: uint, w: var winsize): int {.importc: "ioctl", + header: "", varargs, tags: [WriteIOEffect].} + + proc getTermSize*(): (int, int) = + var w: winsize + let ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, addr(w)) + + if ret == -1: + return (-1, -1) + + return (w.ws_row.int, w.ws_col.int)