From e3a5cdb759ba98ebcdf43e38efaa9d33aa29f466 Mon Sep 17 00:00:00 2001 From: citrons Date: Wed, 29 Jan 2025 21:54:06 -0600 Subject: use terminfo rather than emitting raw sequences --- tui/draw.go | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) (limited to 'tui') 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 } -- cgit v1.2.3