+++ /dev/null
-package termios
-
-import (
- "fmt";
- "os";
- "syscall";
- "unsafe"
- "errors"
-)
-
-// termios types
-type cc_t byte
-type speed_t uint
-type tcflag_t uint
-
-// termios constants
-const (
- BRKINT = tcflag_t (0000002);
- ICRNL = tcflag_t (0000400);
- INPCK = tcflag_t (0000020);
- ISTRIP = tcflag_t (0000040);
- IXON = tcflag_t (0002000);
- OPOST = tcflag_t (0000001);
- CS8 = tcflag_t (0000060);
- ECHO = tcflag_t (0000010);
- ICANON = tcflag_t (0000002);
- IEXTEN = tcflag_t (0100000);
- ISIG = tcflag_t (0000001);
- VTIME = tcflag_t (5);
- VMIN = tcflag_t (6)
-)
-
-const NCCS = 32
-type termios struct {
- c_iflag, c_oflag, c_cflag, c_lflag tcflag_t;
- c_line cc_t;
- c_cc [NCCS]cc_t;
- c_ispeed, c_ospeed speed_t
-}
-
-// ioctl constants
-const (
- TCGETS = 0x5401;
- TCSETS = 0x5402
-)
-
-var (
- orig_termios termios;
- ttyfd uintptr = 0 // STDIN_FILENO
-)
-
-func Ttyfd(fd uintptr) {
- ttyfd=fd
-}
-
-func getTermios (dst *termios) error {
- r1, _, errno := syscall.Syscall (syscall.SYS_IOCTL,
- uintptr (ttyfd), uintptr (TCGETS),
- uintptr (unsafe.Pointer (dst)));
-
- if err := os.NewSyscallError ("SYS_IOCTL", errno); errno!=0 && err != nil {
- return err
- }
-
- if r1 != 0 {
- // return errors.New("Error")
- }
-
- return nil
-}
-
-func setTermios (src *termios) error {
- r1, _, errno := syscall.Syscall (syscall.SYS_IOCTL,
- uintptr (ttyfd), uintptr (TCSETS),
- uintptr (unsafe.Pointer (src)));
-
- if err := os.NewSyscallError ("SYS_IOCTL", errno); errno!=0 &&err != nil {
- return err
- }
-
- if r1 != 0 {
- return errors.New ("Error")
- }
-
- return nil
-}
-
-func tty_raw () error {
- raw := orig_termios;
-
- raw.c_iflag &= ^(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
- raw.c_oflag &= ^(OPOST);
- raw.c_cflag |= (CS8);
- raw.c_lflag &= ^(ECHO | ICANON | IEXTEN | ISIG);
-
- raw.c_cc[VMIN] = 1;
- raw.c_cc[VTIME] = 0;
-
- if err := setTermios (&raw); err != nil { return err }
-
- return nil
-}
-
-func SetRaw () {
- var (
- err error
- )
-
- defer func () {
- if err != nil { fmt.Printf ("SetRaw Error: %v\n",err) }
- } ();
-
- if err = getTermios (&orig_termios); err != nil { return }
-
-// defer func () {
-// err = setTermios (&orig_termios)
-// } ();
-
- if err = tty_raw (); err != nil { return }
- //if err = screenio (); err != nil { return }
-}