diff options
| author | citrons <citrons@mondecitronne.com> | 2025-02-01 14:19:23 -0600 |
|---|---|---|
| committer | citrons <citrons@mondecitronne.com> | 2025-02-01 16:06:42 -0600 |
| commit | 874c492e5c471d4ee9bde1638dc675999b8b1f51 (patch) | |
| tree | 58b36160437b945c35b73749a5decb9f903d59c0 /tui | |
| parent | 75e781cf2cc88f7a775f99998224c658550c198f (diff) | |
renaming/refactoring
Diffstat (limited to 'tui')
| -rw-r--r-- | tui/draw.go | 24 | ||||
| -rw-r--r-- | tui/event.go | 96 |
2 files changed, 56 insertions, 64 deletions
diff --git a/tui/draw.go b/tui/draw.go index 01dfc83..2005f1a 100644 --- a/tui/draw.go +++ b/tui/draw.go @@ -26,30 +26,32 @@ type surface map[pos]char type screen struct { front surface back surface - prevSize Dims + prevSize ScreenSize writer *bufio.Writer cursor pos } -var terminfo *termfo.Terminfo +var ( + terminfo *termfo.Terminfo + scr screen +) -var scr screen func init() { scr.writer = bufio.NewWriterSize(os.Stdout, 50000) Clear() } -type Dims struct { +type ScreenSize struct { Width int Height int } -func Size() Dims { +func Size() ScreenSize { w, h, _ := term.GetSize(0) - return Dims {w, h} + return ScreenSize {w, h} } -func Write(x int, y int, text string, style Style) int { +func WriteAt(x int, y int, text string, style Style) int { width := 0 g := uniseg.NewGraphemes(text) for g.Next() { @@ -107,15 +109,15 @@ func End() { if saved == nil { return } - if term.Restore(0, saved) != nil { - return - } - saved = nil os.Stdout.WriteString( terminfo.Get(caps.ClearScreen) + terminfo.Get(caps.XM, 0) + terminfo.Get(caps.ExitCaMode), ) + if term.Restore(0, saved) != nil { + return + } + saved = nil } func writeCursor(x int, y int) error { 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 |
