38 lines
645 B
Go
38 lines
645 B
Go
|
// +build !windows
|
||
|
|
||
|
package pty
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
// Getsize returns the number of rows (lines) and cols (positions
|
||
|
// in each line) in terminal t.
|
||
|
func Getsize(t *os.File) (rows, cols int, err error) {
|
||
|
var ws winsize
|
||
|
err = windowrect(&ws, t.Fd())
|
||
|
return int(ws.ws_row), int(ws.ws_col), err
|
||
|
}
|
||
|
|
||
|
type winsize struct {
|
||
|
ws_row uint16
|
||
|
ws_col uint16
|
||
|
ws_xpixel uint16
|
||
|
ws_ypixel uint16
|
||
|
}
|
||
|
|
||
|
func windowrect(ws *winsize, fd uintptr) error {
|
||
|
_, _, errno := syscall.Syscall(
|
||
|
syscall.SYS_IOCTL,
|
||
|
fd,
|
||
|
syscall.TIOCGWINSZ,
|
||
|
uintptr(unsafe.Pointer(ws)),
|
||
|
)
|
||
|
if errno != 0 {
|
||
|
return syscall.Errno(errno)
|
||
|
}
|
||
|
return nil
|
||
|
}
|