Merge branch 'devel' of github.com:nim-lang/Nim into devel

This commit is contained in:
Araq 2016-11-29 10:40:14 +01:00
commit c5a336741c
4 changed files with 54 additions and 7 deletions

View file

@ -13,8 +13,10 @@
import import
ast, strutils, strtabs, options, msgs, os, ropes, idents, ast, strutils, strtabs, options, msgs, os, ropes, idents,
wordrecg, syntaxes, renderer, lexer, rstast, rst, rstgen, times, highlite, wordrecg, syntaxes, renderer, lexer, packages/docutils/rstast,
importer, sempass2, json, xmltree, cgi, typesrenderer, astalgo packages/docutils/rst, packages/docutils/rstgen, times,
packages/docutils/highlite, importer, sempass2, json, xmltree, cgi,
typesrenderer, astalgo
type type
TSections = array[TSymKind, Rope] TSections = array[TSymKind, Rope]

View file

@ -4,8 +4,6 @@ hint[XDeclaredButNotUsed]:off
path:"llvm" path:"llvm"
path:"$projectPath/.." path:"$projectPath/.."
path:"$lib/packages/docutils"
define:booting define:booting
#import:"$projectpath/testability" #import:"$projectpath/testability"

View file

@ -13,6 +13,8 @@
## Windows API. ## Windows API.
## Changing the style is permanent even after program termination! Use the ## Changing the style is permanent even after program termination! Use the
## code ``system.addQuitProc(resetAttributes)`` to restore the defaults. ## code ``system.addQuitProc(resetAttributes)`` to restore the defaults.
## Similarly, if you hide the cursor, make sure to unhide it with
## ``showCursor`` before quitting.
import macros import macros
@ -29,6 +31,8 @@ when defined(windows):
BACKGROUND_GREEN = 32 BACKGROUND_GREEN = 32
BACKGROUND_RED = 64 BACKGROUND_RED = 64
BACKGROUND_INTENSITY = 128 BACKGROUND_INTENSITY = 128
FOREGROUND_RGB = FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_BLUE
BACKGROUND_RGB = BACKGROUND_RED or BACKGROUND_GREEN or BACKGROUND_BLUE
type type
SHORT = int16 SHORT = int16
@ -49,6 +53,10 @@ when defined(windows):
srWindow: SMALL_RECT srWindow: SMALL_RECT
dwMaximumWindowSize: COORD dwMaximumWindowSize: COORD
CONSOLE_CURSOR_INFO = object
dwSize: DWORD
bVisible: WINBOOL
proc duplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, proc duplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE,
hTargetProcessHandle: HANDLE, lpTargetHandle: ptr HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: ptr HANDLE,
dwDesiredAccess: DWORD, bInheritHandle: WINBOOL, dwDesiredAccess: DWORD, bInheritHandle: WINBOOL,
@ -60,6 +68,14 @@ when defined(windows):
lpConsoleScreenBufferInfo: ptr CONSOLE_SCREEN_BUFFER_INFO): WINBOOL{.stdcall, lpConsoleScreenBufferInfo: ptr CONSOLE_SCREEN_BUFFER_INFO): WINBOOL{.stdcall,
dynlib: "kernel32", importc: "GetConsoleScreenBufferInfo".} dynlib: "kernel32", importc: "GetConsoleScreenBufferInfo".}
proc getConsoleCursorInfo(hConsoleOutput: HANDLE,
lpConsoleCursorInfo: ptr CONSOLE_CURSOR_INFO): WINBOOL{.
stdcall, dynlib: "kernel32", importc: "GetConsoleCursorInfo".}
proc setConsoleCursorInfo(hConsoleOutput: HANDLE,
lpConsoleCursorInfo: ptr CONSOLE_CURSOR_INFO): WINBOOL{.
stdcall, dynlib: "kernel32", importc: "SetConsoleCursorInfo".}
proc terminalWidthIoctl*(handles: openArray[Handle]): int = proc terminalWidthIoctl*(handles: openArray[Handle]): int =
var csbi: CONSOLE_SCREEN_BUFFER_INFO var csbi: CONSOLE_SCREEN_BUFFER_INFO
for h in handles: for h in handles:
@ -179,6 +195,30 @@ else:
return w return w
return 80 #Finally default to venerable value return 80 #Finally default to venerable value
when defined(windows):
proc setCursorVisibility(f: File, visible: bool) =
var ccsi: CONSOLE_CURSOR_INFO
let h = conHandle(f)
if getConsoleCursorInfo(h, addr(ccsi)) == 0:
raiseOSError(osLastError())
ccsi.bVisible = if visible: 1 else: 0
if setConsoleCursorInfo(h, addr(ccsi)) == 0:
raiseOSError(osLastError())
proc hideCursor*(f: File) =
## Hides the cursor.
when defined(windows):
setCursorVisibility(f, false)
else:
f.write("\e[?25l")
proc showCursor*(f: File) =
## Shows the cursor.
when defined(windows):
setCursorVisibility(f, true)
else:
f.write("\e[?25h")
proc setCursorPos*(f: File, x, y: int) = proc setCursorPos*(f: File, x, y: int) =
## Sets the terminal's cursor to the (x,y) position. ## Sets the terminal's cursor to the (x,y) position.
## (0,0) is the upper left of the screen. ## (0,0) is the upper left of the screen.
@ -369,12 +409,13 @@ proc setStyle*(f: File, style: set[Style]) =
## Sets the terminal style. ## Sets the terminal style.
when defined(windows): when defined(windows):
let h = conHandle(f) let h = conHandle(f)
var old = getAttributes(h) and (FOREGROUND_RGB or BACKGROUND_RGB)
var a = 0'i16 var a = 0'i16
if styleBright in style: a = a or int16(FOREGROUND_INTENSITY) if styleBright in style: a = a or int16(FOREGROUND_INTENSITY)
if styleBlink in style: a = a or int16(BACKGROUND_INTENSITY) if styleBlink in style: a = a or int16(BACKGROUND_INTENSITY)
if styleReverse in style: a = a or 0x4000'i16 # COMMON_LVB_REVERSE_VIDEO if styleReverse in style: a = a or 0x4000'i16 # COMMON_LVB_REVERSE_VIDEO
if styleUnderscore in style: a = a or 0x8000'i16 # COMMON_LVB_UNDERSCORE if styleUnderscore in style: a = a or 0x8000'i16 # COMMON_LVB_UNDERSCORE
discard setConsoleTextAttribute(h, a) discard setConsoleTextAttribute(h, old or a)
else: else:
for s in items(style): for s in items(style):
f.write("\e[" & $ord(s) & 'm') f.write("\e[" & $ord(s) & 'm')
@ -423,7 +464,7 @@ proc setForegroundColor*(f: File, fg: ForegroundColor, bright=false) =
## Sets the terminal's foreground color. ## Sets the terminal's foreground color.
when defined(windows): when defined(windows):
let h = conHandle(f) let h = conHandle(f)
var old = getAttributes(h) and not 0x0007 var old = getAttributes(h) and not FOREGROUND_RGB
if bright: if bright:
old = old or FOREGROUND_INTENSITY old = old or FOREGROUND_INTENSITY
const lookup: array[ForegroundColor, int] = [ const lookup: array[ForegroundColor, int] = [
@ -445,7 +486,7 @@ proc setBackgroundColor*(f: File, bg: BackgroundColor, bright=false) =
## Sets the terminal's background color. ## Sets the terminal's background color.
when defined(windows): when defined(windows):
let h = conHandle(f) let h = conHandle(f)
var old = getAttributes(h) and not 0x0070 var old = getAttributes(h) and not BACKGROUND_RGB
if bright: if bright:
old = old or BACKGROUND_INTENSITY old = old or BACKGROUND_INTENSITY
const lookup: array[BackgroundColor, int] = [ const lookup: array[BackgroundColor, int] = [
@ -558,6 +599,8 @@ proc getch*(): char =
discard fd.tcsetattr(TCSADRAIN, addr oldMode) discard fd.tcsetattr(TCSADRAIN, addr oldMode)
# Wrappers assuming output to stdout: # Wrappers assuming output to stdout:
template hideCursor*() = hideCursor(stdout)
template showCursor*() = showCursor(stdout)
template setCursorPos*(x, y: int) = setCursorPos(stdout, x, y) template setCursorPos*(x, y: int) = setCursorPos(stdout, x, y)
template setCursorXPos*(x: int) = setCursorXPos(stdout, x) template setCursorXPos*(x: int) = setCursorXPos(stdout, x)
when defined(windows): when defined(windows):

View file

@ -39,6 +39,10 @@ Library Additions
``deques`` provides a superset of ``queues`` API with clear naming. ``deques`` provides a superset of ``queues`` API with clear naming.
``queues`` module is now deprecated and will be removed in the future. ``queues`` module is now deprecated and will be removed in the future.
- Added ``hideCursor`` and ``showCursor`` to the ``terminal``
`(doc) <http://nim-lang.org/docs/terminal.html>`_ module.
Tool Additions Tool Additions
-------------- --------------