You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

143 lines
3.1 KiB

package keyboard
type (
Key uint16
keyEvent struct {
key Key // One of Key* constants, invalid if 'Ch' is not 0
rune rune // A unicode character
err error // Error in case if input failed
}
)
// Key constants, see GetKey() function.
const (
KeyF1 Key = 0xFFFF - iota
KeyF2
KeyF3
KeyF4
KeyF5
KeyF6
KeyF7
KeyF8
KeyF9
KeyF10
KeyF11
KeyF12
KeyInsert
KeyDelete
KeyHome
KeyEnd
KeyPgup
KeyPgdn
KeyArrowUp
KeyArrowDown
KeyArrowLeft
KeyArrowRight
key_min // see terminfo
)
const (
KeyCtrlTilde Key = 0x00
KeyCtrl2 Key = 0x00
KeyCtrlSpace Key = 0x00
KeyCtrlA Key = 0x01
KeyCtrlB Key = 0x02
KeyCtrlC Key = 0x03
KeyCtrlD Key = 0x04
KeyCtrlE Key = 0x05
KeyCtrlF Key = 0x06
KeyCtrlG Key = 0x07
KeyBackspace Key = 0x08
KeyCtrlH Key = 0x08
KeyTab Key = 0x09
KeyCtrlI Key = 0x09
KeyCtrlJ Key = 0x0A
KeyCtrlK Key = 0x0B
KeyCtrlL Key = 0x0C
KeyEnter Key = 0x0D
KeyCtrlM Key = 0x0D
KeyCtrlN Key = 0x0E
KeyCtrlO Key = 0x0F
KeyCtrlP Key = 0x10
KeyCtrlQ Key = 0x11
KeyCtrlR Key = 0x12
KeyCtrlS Key = 0x13
KeyCtrlT Key = 0x14
KeyCtrlU Key = 0x15
KeyCtrlV Key = 0x16
KeyCtrlW Key = 0x17
KeyCtrlX Key = 0x18
KeyCtrlY Key = 0x19
KeyCtrlZ Key = 0x1A
KeyEsc Key = 0x1B
KeyCtrlLsqBracket Key = 0x1B
KeyCtrl3 Key = 0x1B
KeyCtrl4 Key = 0x1C
KeyCtrlBackslash Key = 0x1C
KeyCtrl5 Key = 0x1D
KeyCtrlRsqBracket Key = 0x1D
KeyCtrl6 Key = 0x1E
KeyCtrl7 Key = 0x1F
KeyCtrlSlash Key = 0x1F
KeyCtrlUnderscore Key = 0x1F
KeySpace Key = 0x20
KeyBackspace2 Key = 0x7F
KeyCtrl8 Key = 0x7F
)
var (
isOpen bool = false
waitingForKey bool = false
input_comm = make(chan keyEvent)
cancel_key = make(chan struct{})
)
func Open() (err error) {
if (isOpen) {
return
}
err = initConsole()
if err == nil {
isOpen = true
}
return
}
// Should be called after successful initialization when functionality isn't required anymore.
func Close() {
if !isOpen {
return
}
if waitingForKey {
cancel_key <- struct{}{}
}
releaseConsole()
isOpen = false
}
func GetKey() (rune, Key, error) {
if !isOpen {
panic("function GetKey() should be called after Open()")
}
waitingForKey = true
defer func() { waitingForKey = false }()
select {
case ev := <-input_comm:
return ev.rune, ev.key, ev.err
case <-cancel_key:
return 0, 0, nil
}
}
func GetSingleKey() (ch rune, key Key, err error) {
err = Open()
if err == nil {
ch, key, err = GetKey()
Close()
}
return
}