mirror of https://github.com/EasyDarwin/EasyDarwin
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
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 |
|
} |