From 874c492e5c471d4ee9bde1638dc675999b8b1f51 Mon Sep 17 00:00:00 2001 From: citrons Date: Sat, 1 Feb 2025 14:19:23 -0600 Subject: renaming/refactoring --- tui/event.go | 96 +++++++++++++++++++++++++++--------------------------------- 1 file changed, 43 insertions(+), 53 deletions(-) (limited to 'tui/event.go') 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 -- cgit v1.2.3