I'm writing a text interface in golang, and if you type while it's printing, it will interfere with the text being presented. I know "stty -echo" will stop echoing the keyboard's output and "stty echo" reenables it, but when I write functions like:
func disableKeyboard() {
c := exec.Command("stty -echo")
c.Stdout = os.Stdout
c.Run()
}
func enableKeyboard() {
c := exec.Command("stty echo")
c.Stdout = os.Stdout
c.Run()
}
these have no impact on my programs output. Is there something wrong with the way I'm sending these commands?
Something like:
disableKeyboard()
time.Sleep(time.Second)
enableKeyboard()
doesn't work. I'm using a mac currently.
The crypto/ssh/terminal package (which isn't standard lib for some reason) has code that does what you need, though it uses pretty low-level syscalls to make it happen. You can probably adapt it to what you're trying to do (by using syscall.Stdin
as the file descriptor). As Flimzy pointed out, though, this still doesn't disable keyboard input, it simply suppresses it from echoing to terminal, so you may still have to flush the input if you depend on it later.