88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
|
// +build windows
|
||
|
|
||
|
package term
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// Consts for Get/SetConsoleMode function
|
||
|
// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
|
||
|
ENABLE_ECHO_INPUT = 0x0004
|
||
|
ENABLE_INSERT_MODE = 0x0020
|
||
|
ENABLE_LINE_INPUT = 0x0002
|
||
|
ENABLE_MOUSE_INPUT = 0x0010
|
||
|
ENABLE_PROCESSED_INPUT = 0x0001
|
||
|
ENABLE_QUICK_EDIT_MODE = 0x0040
|
||
|
ENABLE_WINDOW_INPUT = 0x0008
|
||
|
// If parameter is a screen buffer handle, additional values
|
||
|
ENABLE_PROCESSED_OUTPUT = 0x0001
|
||
|
ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
|
||
|
)
|
||
|
|
||
|
var kernel32DLL = syscall.NewLazyDLL("kernel32.dll")
|
||
|
|
||
|
var (
|
||
|
setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode")
|
||
|
getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo")
|
||
|
)
|
||
|
|
||
|
func GetConsoleMode(fileDesc uintptr) (uint32, error) {
|
||
|
var mode uint32
|
||
|
err := syscall.GetConsoleMode(syscall.Handle(fileDesc), &mode)
|
||
|
return mode, err
|
||
|
}
|
||
|
|
||
|
func SetConsoleMode(fileDesc uintptr, mode uint32) error {
|
||
|
r, _, err := setConsoleModeProc.Call(fileDesc, uintptr(mode), 0)
|
||
|
if r == 0 {
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return syscall.EINVAL
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// types for calling GetConsoleScreenBufferInfo
|
||
|
// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx
|
||
|
type (
|
||
|
SHORT int16
|
||
|
|
||
|
SMALL_RECT struct {
|
||
|
Left SHORT
|
||
|
Top SHORT
|
||
|
Right SHORT
|
||
|
Bottom SHORT
|
||
|
}
|
||
|
|
||
|
COORD struct {
|
||
|
X SHORT
|
||
|
Y SHORT
|
||
|
}
|
||
|
|
||
|
WORD uint16
|
||
|
|
||
|
CONSOLE_SCREEN_BUFFER_INFO struct {
|
||
|
dwSize COORD
|
||
|
dwCursorPosition COORD
|
||
|
wAttributes WORD
|
||
|
srWindow SMALL_RECT
|
||
|
dwMaximumWindowSize COORD
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) {
|
||
|
var info CONSOLE_SCREEN_BUFFER_INFO
|
||
|
r, _, err := getConsoleScreenBufferInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&info)), 0)
|
||
|
if r == 0 {
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return nil, syscall.EINVAL
|
||
|
}
|
||
|
return &info, nil
|
||
|
}
|