| // +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 |
| } |