term.go 606 B

12345678910111213141516171819202122232425262728293031323334
  1. // +build !windows
  2. package term
  3. import (
  4. "sync"
  5. "github.com/pkg/term/termios"
  6. "golang.org/x/sys/unix"
  7. )
  8. var (
  9. saveTermios unix.Termios
  10. saveTermiosFD int
  11. saveTermiosOnce sync.Once
  12. )
  13. func getOriginalTermios(fd int) (unix.Termios, error) {
  14. var err error
  15. saveTermiosOnce.Do(func() {
  16. saveTermiosFD = fd
  17. err = termios.Tcgetattr(uintptr(fd), &saveTermios)
  18. })
  19. return saveTermios, err
  20. }
  21. // Restore terminal's mode.
  22. func Restore() error {
  23. o, err := getOriginalTermios(saveTermiosFD)
  24. if err != nil {
  25. return err
  26. }
  27. return termios.Tcsetattr(uintptr(saveTermiosFD), termios.TCSANOW, &o)
  28. }