// +build !windows,!solaris package pty import ( "os" "syscall" "unsafe" ) // InheritSize applies the terminal size of pty to tty. This should be run // in a signal handler for syscall.SIGWINCH to automatically resize the tty when // the pty receives a window size change notification. func InheritSize(pty, tty *os.File) error { size, err := GetsizeFull(pty) if err != nil { return err } err = Setsize(tty, size) if err != nil { return err } return nil } // Setsize resizes t to s. func Setsize(t *os.File, ws *Winsize) error { return windowRectCall(ws, t.Fd(), syscall.TIOCSWINSZ) } // GetsizeFull returns the full terminal size description. func GetsizeFull(t *os.File) (size *Winsize, err error) { var ws Winsize err = windowRectCall(&ws, t.Fd(), syscall.TIOCGWINSZ) return &ws, err } // 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) { ws, err := GetsizeFull(t) return int(ws.Rows), int(ws.Cols), err } // Winsize describes the terminal size. type Winsize struct { Rows uint16 // ws_row: Number of rows (in cells) Cols uint16 // ws_col: Number of columns (in cells) X uint16 // ws_xpixel: Width in pixels Y uint16 // ws_ypixel: Height in pixels } func windowRectCall(ws *Winsize, fd, a2 uintptr) error { _, _, errno := syscall.Syscall( syscall.SYS_IOCTL, fd, a2, uintptr(unsafe.Pointer(ws)), ) if errno != 0 { return syscall.Errno(errno) } return nil }