58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
// Copyright 2013 Apcera Inc. All rights reserved.
|
|
|
|
// +build windows
|
|
|
|
package term
|
|
|
|
// Used when we have no other source for getting platform-specific information
|
|
// about the terminal sizes available.
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// Based on source from from golang.org/x/crypto/ssh/terminal/util_windows.go
|
|
var (
|
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
|
|
procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
|
|
)
|
|
|
|
type (
|
|
short int16
|
|
word uint16
|
|
|
|
coord struct {
|
|
x short
|
|
y short
|
|
}
|
|
smallRect struct {
|
|
left short
|
|
top short
|
|
right short
|
|
bottom short
|
|
}
|
|
consoleScreenBufferInfo struct {
|
|
size coord
|
|
cursorPosition coord
|
|
attributes word
|
|
window smallRect
|
|
maximumWindowSize coord
|
|
}
|
|
)
|
|
|
|
// GetTerminalWindowSize returns the width and height of a terminal in Windows.
|
|
func GetTerminalWindowSize(file *os.File) (*Size, error) {
|
|
var info consoleScreenBufferInfo
|
|
_, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, file.Fd(), uintptr(unsafe.Pointer(&info)), 0)
|
|
if e != 0 {
|
|
return nil, error(e)
|
|
}
|
|
return &Size{
|
|
Lines: int(info.size.y),
|
|
Columns: int(info.size.x),
|
|
}, nil
|
|
}
|