// RawMode places the terminal into raw mode. func RawMode(t *Term) error { var a attr if err := termios.Tcgetattr(uintptr(t.fd), (*syscall.Termios)(&a)); err != nil { return err } termios.Cfmakeraw((*syscall.Termios)(&a)) return termios.Tcsetattr(uintptr(t.fd), termios.TCSANOW, (*syscall.Termios)(&a)) }
func (t *Term) setSpeed(baud int) error { var a attr if err := termios.Tcgetattr(uintptr(t.fd), (*syscall.Termios)(&a)); err != nil { return err } a.setSpeed(baud) return termios.Tcsetattr(uintptr(t.fd), termios.TCSANOW, (*syscall.Termios)(&a)) }
func (t *Term) setReadTimeout(d time.Duration) error { var a attr if err := termios.Tcgetattr(uintptr(t.fd), (*syscall.Termios)(&a)); err != nil { return err } a.Cc[syscall.VMIN], a.Cc[syscall.VTIME] = timeoutVals(d) return termios.Tcsetattr(uintptr(t.fd), termios.TCSANOW, (*syscall.Termios)(&a)) }
func SetRaw(tty *os.File) error { var attr syscall.Termios err := termios.Tcgetattr(uintptr(tty.Fd()), (*syscall.Termios)(&attr)) if err != nil { return err } termios.Cfmakeraw((*syscall.Termios)(&attr)) return termios.Tcsetattr(uintptr(tty.Fd()), termios.TCSANOW, (*syscall.Termios)(&attr)) }
func (p *Pty) Copy(o *os.File) (err error) { var attr syscall.Termios if err = termios.Tcgetattr(o.Fd(), &attr); err != nil { return err } w, h, err := GetSize(o.Fd()) if err != nil { return err } if err = SetSize(p.tty.Fd(), w, h); err != nil { return err } err = termios.Tcsetattr(p.tty.Fd(), termios.TCSADRAIN, &attr) if err != nil { return err } return nil }
func (t *Term) setFlowControl(kind int) error { var a attr if err := termios.Tcgetattr(uintptr(t.fd), (*syscall.Termios)(&a)); err != nil { return err } switch kind { case NONE: a.Iflag &^= termios.IXON | termios.IXOFF | termios.IXANY a.Cflag &^= termios.CRTSCTS case XONXOFF: a.Cflag &^= termios.CRTSCTS a.Iflag |= termios.IXON | termios.IXOFF | termios.IXANY case HARDWARE: a.Iflag &^= termios.IXON | termios.IXOFF | termios.IXANY a.Cflag |= termios.CRTSCTS } return termios.Tcsetattr(uintptr(t.fd), termios.TCSANOW, (*syscall.Termios)(&a)) }
// Restore restores the state of the terminal captured at the point that // the terminal was originally opened. func (t *Term) Restore() error { return termios.Tcsetattr(uintptr(t.fd), termios.TCIOFLUSH, &t.orig) }
func setTerm(term syscall.Termios) { if err := termios.Tcsetattr(uintptr(syscall.Stdin), termios.TCSAFLUSH, &term); err != nil { panic(err) } }
func tcsetattr(fd uintptr, t syscall.Termios) error { if err := termios.Tcsetattr(fd, termios.TCSAFLUSH, &t); err != nil { return fmt.Errorf("tcsetattr: %v", err) } return nil }