summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcitrons <citrons@mondecitronne.com>2025-01-29 21:54:06 -0600
committercitrons <citrons@mondecitronne.com>2025-01-29 21:54:06 -0600
commite3a5cdb759ba98ebcdf43e38efaa9d33aa29f466 (patch)
tree38e78ca873096f0a1c729d2435bfdf3c9c8a541b
parentbfb892b0fc8c93e97f2adf47bc7b1314ca3eaba6 (diff)
use terminfo rather than emitting raw sequences
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--tui/draw.go41
3 files changed, 33 insertions, 11 deletions
diff --git a/go.mod b/go.mod
index 25b5491..4d917c7 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index 362ba65..a983ea6 100644
--- a/go.sum
+++ b/go.sum
@@ -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
}