mirror of https://github.com/ethereum/go-ethereum
repl console output is now colored. repl "exit" command now works.pull/138/head
parent
294b437414
commit
7227552f42
@ -0,0 +1,80 @@ |
||||
/* Inspired by https://github.com/xuyu/logging/blob/master/colorful_win.go */ |
||||
|
||||
package ethrepl |
||||
|
||||
import ( |
||||
"syscall" |
||||
"unsafe" |
||||
) |
||||
|
||||
type color uint16 |
||||
|
||||
const ( |
||||
green = color(0x0002) |
||||
red = color(0x0004) |
||||
yellow = color(0x000E) |
||||
) |
||||
|
||||
const ( |
||||
mask = uint16(yellow | green | red) |
||||
) |
||||
|
||||
var ( |
||||
kernel32 = syscall.NewLazyDLL("kernel32.dll") |
||||
procGetStdHandle = kernel32.NewProc("GetStdHandle") |
||||
procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") |
||||
procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") |
||||
hStdout uintptr |
||||
initScreenInfo *consoleScreenBufferInfo |
||||
) |
||||
|
||||
func setConsoleTextAttribute(hConsoleOutput uintptr, wAttributes uint16) bool { |
||||
ret, _, _ := procSetConsoleTextAttribute.Call(hConsoleOutput, uintptr(wAttributes)) |
||||
return ret != 0 |
||||
} |
||||
|
||||
type coord struct { |
||||
X, Y int16 |
||||
} |
||||
|
||||
type smallRect struct { |
||||
Left, Top, Right, Bottom int16 |
||||
} |
||||
|
||||
type consoleScreenBufferInfo struct { |
||||
DwSize coord |
||||
DwCursorPosition coord |
||||
WAttributes uint16 |
||||
SrWindow smallRect |
||||
DwMaximumWindowSize coord |
||||
} |
||||
|
||||
func getConsoleScreenBufferInfo(hConsoleOutput uintptr) *consoleScreenBufferInfo { |
||||
var csbi consoleScreenBufferInfo |
||||
ret, _, _ := procGetConsoleScreenBufferInfo.Call(hConsoleOutput, uintptr(unsafe.Pointer(&csbi))) |
||||
if ret == 0 { |
||||
return nil |
||||
} |
||||
return &csbi |
||||
} |
||||
|
||||
const ( |
||||
stdOutputHandle = uint32(-11 & 0xFFFFFFFF) |
||||
) |
||||
|
||||
func init() { |
||||
hStdout, _, _ = procGetStdHandle.Call(uintptr(stdOutputHandle)) |
||||
initScreenInfo = getConsoleScreenBufferInfo(hStdout) |
||||
} |
||||
|
||||
func resetColorful() { |
||||
if initScreenInfo == nil { |
||||
return |
||||
} |
||||
setConsoleTextAttribute(hStdout, initScreenInfo.WAttributes) |
||||
} |
||||
|
||||
func changeColor(c color) { |
||||
attr := uint16(0) & ^mask | uint16(c) |
||||
setConsoleTextAttribute(hStdout, attr) |
||||
} |
Loading…
Reference in new issue