| // |
| |
| package pty |
| |
| import ( |
| "os" |
| |
| "golang.org/x/sys/unix" |
| ) |
| |
| const ( |
| TIOCGWINSZ = 21608 // 'T' << 8 | 104 |
| TIOCSWINSZ = 21607 // 'T' << 8 | 103 |
| ) |
| |
| // 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 |
| } |
| |
| // GetsizeFull returns the full terminal size description. |
| func GetsizeFull(t *os.File) (size *Winsize, err error) { |
| var wsz *unix.Winsize |
| wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) |
| |
| if err != nil { |
| return nil, err |
| } else { |
| return &Winsize{wsz.Row, wsz.Col, wsz.Xpixel, wsz.Ypixel}, nil |
| } |
| } |
| |
| // Get Windows Size |
| func Getsize(t *os.File) (rows, cols int, err error) { |
| var wsz *unix.Winsize |
| wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) |
| |
| if err != nil { |
| return 80, 25, err |
| } else { |
| return int(wsz.Row), int(wsz.Col), nil |
| } |
| } |
| |
| // Setsize resizes t to s. |
| func Setsize(t *os.File, ws *Winsize) error { |
| wsz := unix.Winsize{ws.Rows, ws.Cols, ws.X, ws.Y} |
| return unix.IoctlSetWinsize(int(t.Fd()), TIOCSWINSZ, &wsz) |
| } |