// +build darwin freebsd linux solaris package console import ( "golang.org/x/sys/unix" ) func tcget(fd uintptr, p *unix.Termios) error { termios, err := unix.IoctlGetTermios(int(fd), cmdTcGet) if err != nil { return err } *p = *termios return nil } func tcset(fd uintptr, p *unix.Termios) error { return unix.IoctlSetTermios(int(fd), cmdTcSet, p) } func tcgwinsz(fd uintptr) (WinSize, error) { var ws WinSize uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) if err != nil { return ws, err } // Translate from unix.Winsize to console.WinSize ws.Height = uws.Row ws.Width = uws.Col ws.x = uws.Xpixel ws.y = uws.Ypixel return ws, nil } func tcswinsz(fd uintptr, ws WinSize) error { // Translate from console.WinSize to unix.Winsize var uws unix.Winsize uws.Row = ws.Height uws.Col = ws.Width uws.Xpixel = ws.x uws.Ypixel = ws.y return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, &uws) } func setONLCR(fd uintptr, enable bool) error { var termios unix.Termios if err := tcget(fd, &termios); err != nil { return err } if enable { // Set +onlcr so we can act like a real terminal termios.Oflag |= unix.ONLCR } else { // Set -onlcr so we don't have to deal with \r. termios.Oflag &^= unix.ONLCR } return tcset(fd, &termios) } func cfmakeraw(t unix.Termios) unix.Termios { t.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) t.Oflag &^= unix.OPOST t.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) t.Cflag &^= (unix.CSIZE | unix.PARENB) t.Cflag &^= unix.CS8 t.Cc[unix.VMIN] = 1 t.Cc[unix.VTIME] = 0 return t }