59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
|
// +build linux,!baremetal
|
||
|
|
||
|
// Package rawterm provides some sort of raw terminal interface, both on hosted
|
||
|
// systems and baremetal. It is intended only for use by examples.
|
||
|
//
|
||
|
// Newlines are always LF (not CR or CRLF). While terminals generally use a
|
||
|
// different format (CR when pressing the enter key and CRLF for newline) the
|
||
|
// format returned by Getchar and expected as input by Putchar is a single LF
|
||
|
// as newline symbol.
|
||
|
package rawterm
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
|
||
|
"golang.org/x/crypto/ssh/terminal"
|
||
|
)
|
||
|
|
||
|
var terminalState *terminal.State
|
||
|
|
||
|
// Getchar returns a single character from stdin, or a serial input. Newlines
|
||
|
// are encoded with a single LF ('\n').
|
||
|
func Getchar() byte {
|
||
|
var b [1]byte
|
||
|
os.Stdin.Read(b[:])
|
||
|
if b[0] == '\r' {
|
||
|
return '\n'
|
||
|
}
|
||
|
return b[0]
|
||
|
}
|
||
|
|
||
|
// Putchar writes a single character to the terminal. Newlines are expected to
|
||
|
// be encoded as LF symbols ('\n').
|
||
|
func Putchar(ch byte) {
|
||
|
if ch == '\n' {
|
||
|
// Terminals expect CRLF.
|
||
|
Putchar('\r')
|
||
|
}
|
||
|
b := [1]byte{ch}
|
||
|
os.Stdout.Write(b[:])
|
||
|
}
|
||
|
|
||
|
// Configure initializes the terminal for use by raw reading/writing (using
|
||
|
// Getchar/Putchar). It must be restored after use with Restore. You can do this
|
||
|
// with the following code:
|
||
|
//
|
||
|
// rawterm.Configure()
|
||
|
// defer rawterm.Restore()
|
||
|
// // use raw terminal features
|
||
|
func Configure() {
|
||
|
terminalState, _ = terminal.MakeRaw(0)
|
||
|
}
|
||
|
|
||
|
// Restore restores the state to before a call to Configure. It must be called
|
||
|
// after a call to Configure to restore the terminal state, and must only be
|
||
|
// called after a call to Configure.
|
||
|
func Restore() {
|
||
|
terminal.Restore(0, terminalState)
|
||
|
}
|