summaryrefslogtreecommitdiff
path: root/tui/draw.go
diff options
context:
space:
mode:
Diffstat (limited to 'tui/draw.go')
-rw-r--r--tui/draw.go41
1 files changed, 30 insertions, 11 deletions
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
}