|
|
|
|
|
package readline |
|
|
|
import ( |
|
"syscall" |
|
) |
|
|
|
type Termios syscall.Termios |
|
|
|
func SetRawMode(fd uintptr) (*Termios, error) { |
|
termios, err := getTermios(fd) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
newTermios := *termios |
|
newTermios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON |
|
newTermios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN |
|
newTermios.Cflag &^= syscall.CSIZE | syscall.PARENB |
|
newTermios.Cflag |= syscall.CS8 |
|
newTermios.Cc[syscall.VMIN] = 1 |
|
newTermios.Cc[syscall.VTIME] = 0 |
|
|
|
return termios, setTermios(fd, &newTermios) |
|
} |
|
|
|
func UnsetRawMode(fd uintptr, termios any) error { |
|
t := termios.(*Termios) |
|
return setTermios(fd, t) |
|
} |
|
|
|
|
|
func IsTerminal(fd uintptr) bool { |
|
_, err := getTermios(fd) |
|
return err == nil |
|
} |
|
|