diff options
| author | citrons <citrons@mondecitronne.com> | 2025-01-29 21:54:06 -0600 |
|---|---|---|
| committer | citrons <citrons@mondecitronne.com> | 2025-01-29 21:54:06 -0600 |
| commit | e3a5cdb759ba98ebcdf43e38efaa9d33aa29f466 (patch) | |
| tree | 38e78ca873096f0a1c729d2435bfdf3c9c8a541b | |
| parent | bfb892b0fc8c93e97f2adf47bc7b1314ca3eaba6 (diff) | |
use terminfo rather than emitting raw sequences
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | tui/draw.go | 41 |
3 files changed, 33 insertions, 11 deletions
@@ -5,6 +5,7 @@ go 1.23.4 require ( github.com/rivo/uniseg v0.4.7 golang.org/x/term v0.28.0 + zgo.at/termfo v0.0.0-20240522162355-df5e07d67a5a ) require golang.org/x/sys v0.29.0 // indirect @@ -4,3 +4,5 @@ golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +zgo.at/termfo v0.0.0-20240522162355-df5e07d67a5a h1:xUxSj/In2mmaBYwNcmDZyyh+lMv9MpYnAUskTdjtJhc= +zgo.at/termfo v0.0.0-20240522162355-df5e07d67a5a/go.mod h1:p6tU/Jw86OwNL/dvosR/GtaB+ABfGMB5U0wQgxBVstA= diff --git a/tui/draw.go b/tui/draw.go index 671d7e1..01dfc83 100644 --- a/tui/draw.go +++ b/tui/draw.go @@ -3,9 +3,10 @@ package tui import ( "github.com/rivo/uniseg" "golang.org/x/term" + "zgo.at/termfo" + "zgo.at/termfo/caps" "unicode" "unicode/utf8" - "fmt" "bufio" "os" ) @@ -30,6 +31,8 @@ type screen struct { cursor pos } +var terminfo *termfo.Terminfo + var scr screen func init() { scr.writer = bufio.NewWriterSize(os.Stdout, 50000) @@ -84,8 +87,19 @@ func Start() error { if err != nil { return err } + terminfo, err = termfo.New("") + if err != nil { + if terminfo, err = termfo.New("xterm"); err != nil { + return err + } + } + scr.back = make(surface) - _, err = os.Stdout.WriteString("\033[?47h\033[2J\033[?2004h") + _, err = os.Stdout.WriteString( + terminfo.Get(caps.EnterCaMode) + + terminfo.Get(caps.XM, 1) + + terminfo.Get(caps.ClearScreen), + ) return err } @@ -96,47 +110,52 @@ func End() { if term.Restore(0, saved) != nil { return } - os.Stdout.WriteString("\033[?2004l\033[2J\033[0;0H\033[?47l") + saved = nil + os.Stdout.WriteString( + terminfo.Get(caps.ClearScreen) + + terminfo.Get(caps.XM, 0) + + terminfo.Get(caps.ExitCaMode), + ) } func writeCursor(x int, y int) error { - _, err := scr.writer.WriteString(fmt.Sprintf("\033[%d;%dH", y + 1, x + 1)) + _, err := scr.writer.WriteString(terminfo.Get(caps.CursorAddress, y, x)) return err } func writeStyle(style Style) error { - _, err := scr.writer.WriteString("\033[0m") + _, err := scr.writer.WriteString(terminfo.Get(caps.ExitAttributeMode)) if err != nil { return err } - _, err = scr.writer.WriteString(fmt.Sprintf("\033[38;5;%dm", style.Fg)) + _, err = scr.writer.WriteString(terminfo.Get(caps.SetAForeground, int(style.Fg))) if err != nil { return err } - _, err = scr.writer.WriteString(fmt.Sprintf("\033[48;5;%dm", style.Bg)) + _, err = scr.writer.WriteString(terminfo.Get(caps.SetABackground, int(style.Bg))) if err != nil { return err } if style.Bold { - _, err = scr.writer.WriteString("\033[1m") + _, err = scr.writer.WriteString(terminfo.Get(caps.EnterBoldMode)) if err != nil { return err } } if style.Italic { - _, err = scr.writer.WriteString("\033[3m") + _, err = scr.writer.WriteString(terminfo.Get(caps.EnterItalicsMode)) if err != nil { return err } } if style.Underline { - _, err = scr.writer.WriteString("\033[4m") + _, err = scr.writer.WriteString(terminfo.Get(caps.EnterUnderlineMode)) if err != nil { return err } } if style.Strikethrough { - _, err = scr.writer.WriteString("\033[9m") + _, err = scr.writer.WriteString(terminfo.Get(caps.Smxx)) if err != nil { return err } |
