|
@@ -1,3 +1,5 @@
|
|
|
+// +build !windows
|
|
|
+
|
|
|
package pty
|
|
|
|
|
|
import (
|
|
@@ -6,26 +8,53 @@ import (
|
|
|
"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) {
|
|
|
- var ws winsize
|
|
|
- err = windowrect(&ws, t.Fd())
|
|
|
- return int(ws.ws_row), int(ws.ws_col), err
|
|
|
+ ws, err := GetsizeFull(t)
|
|
|
+ return int(ws.Rows), int(ws.Cols), err
|
|
|
}
|
|
|
|
|
|
-type winsize struct {
|
|
|
- ws_row uint16
|
|
|
- ws_col uint16
|
|
|
- ws_xpixel uint16
|
|
|
- ws_ypixel uint16
|
|
|
+// 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 windowrect(ws *winsize, fd uintptr) error {
|
|
|
+func windowRectCall(ws *Winsize, fd, a2 uintptr) error {
|
|
|
_, _, errno := syscall.Syscall(
|
|
|
syscall.SYS_IOCTL,
|
|
|
fd,
|
|
|
- syscall.TIOCGWINSZ,
|
|
|
+ a2,
|
|
|
uintptr(unsafe.Pointer(ws)),
|
|
|
)
|
|
|
if errno != 0 {
|