summaryrefslogtreecommitdiff
path: root/tui/event.go
diff options
context:
space:
mode:
Diffstat (limited to 'tui/event.go')
-rw-r--r--tui/event.go96
1 files changed, 43 insertions, 53 deletions
diff --git a/tui/event.go b/tui/event.go
index 997a8a4..5ce7c4e 100644
--- a/tui/event.go
+++ b/tui/event.go
@@ -26,60 +26,14 @@ type Event struct {
Resize bool
}
-var evChan chan Event
-var once sync.Once
+var (
+ evChan chan Event = make(chan Event, 1)
+ once sync.Once
+)
func Events() <-chan Event {
once.Do(func() {
- evChan = make(chan Event, 2)
-
- // buffer FindKeys
- ch := make(chan termfo.Event, 16)
- go func() {
- r := bufio.NewReader(os.Stdin)
- for e := range terminfo.FindKeys(r) {
- ch <- e
- if e.Err != nil {
- return
- }
- }
- }()
-
- go func() {
- for kev := range ch {
- var ev Event
- if kev.Err != nil {
- ev.Err = kev.Err
- evChan <- ev
- return
- }
-
- noMods := kev.Key & (keys.Ctrl | keys.Alt) == 0
- notSpecial := kev.Key.WithoutMods() < (1 << 32)
- if noMods && notSpecial {
- r := rune(kev.Key.WithoutMods())
- if kev.Key & keys.Shift != 0 && r >= 'a' && r <= 'z' {
- r -= 0x20
- }
- ev.TextInput = r
- }
- if kev.Key == keys.Tab {
- ev.TextInput = '\t'
- }
-
- switch kev.Key {
- case keys.Mouse:
- if err := parseMouse(&ev, ch); err != nil {
- ev.Err = err
- evChan <- ev
- return
- }
- default:
- ev.Key = kev.Key
- }
-
- evChan <- ev
- }
- }()
+ ch := terminfo.FindKeys(bufio.NewReader(os.Stdin))
+ go readKeys(ch, evChan)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGWINCH)
@@ -89,10 +43,46 @@ func Events() <-chan Event {
}
}()
})
-
return evChan
}
+func readKeys(ch <-chan termfo.Event, evChan chan<- Event) {
+ for kev := range ch {
+ var ev Event
+ if kev.Err != nil {
+ ev.Err = kev.Err
+ evChan <- ev
+ return
+ }
+
+ noMods := kev.Key & (keys.Ctrl | keys.Alt) == 0
+ notSpecial := kev.Key.WithoutMods() < (1 << 32)
+ if noMods && notSpecial {
+ r := rune(kev.Key.WithoutMods())
+ if kev.Key & keys.Shift != 0 && r >= 'a' && r <= 'z' {
+ r -= 0x20
+ }
+ ev.TextInput = r
+ }
+ if kev.Key == keys.Tab {
+ ev.TextInput = '\t'
+ }
+
+ switch kev.Key {
+ case keys.Mouse:
+ if err := parseMouse(&ev, ch); err != nil {
+ ev.Err = err
+ evChan <- ev
+ return
+ }
+ default:
+ ev.Key = kev.Key
+ }
+
+ evChan <- ev
+ }
+}
+
func parseMouse(ev *Event, ch <-chan termfo.Event) error {
var (
arg strings.Builder