From 34bb46304c8720b40194472ca5e311e0985f1fab Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 3 May 2024 11:58:53 -0300 Subject: [PATCH] fix: detect bg when no allocate pty (#268) refs #262 --- bubbletea/tea_unix.go | 41 +++++++++++++++++++++++++++++++++-------- examples/go.mod | 4 ++-- examples/go.sum | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/bubbletea/tea_unix.go b/bubbletea/tea_unix.go index e007c6e..dc967c4 100644 --- a/bubbletea/tea_unix.go +++ b/bubbletea/tea_unix.go @@ -4,10 +4,14 @@ package bubbletea import ( + "image/color" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/ssh" "github.com/charmbracelet/x/exp/term" + "github.com/charmbracelet/x/exp/term/ansi" + "github.com/charmbracelet/x/exp/term/input" "github.com/lucasb-eyer/go-colorful" "github.com/muesli/termenv" ) @@ -30,20 +34,24 @@ func makeOpts(s ssh.Session) []tea.ProgramOption { func newRenderer(s ssh.Session) *lipgloss.Renderer { pty, _, ok := s.Pty() env := sshEnviron(append(s.Environ(), "TERM="+pty.Term)) - if !ok || pty.Slave == nil { - return lipgloss.NewRenderer( + var r *lipgloss.Renderer + var bg color.Color + if ok && pty.Slave != nil { + r = lipgloss.NewRenderer( + pty.Slave, + termenv.WithEnvironment(env), + termenv.WithColorCache(true), + ) + bg = term.BackgroundColor(pty.Slave, pty.Slave) + } else { + r = lipgloss.NewRenderer( s, termenv.WithEnvironment(env), termenv.WithUnsafe(), termenv.WithColorCache(true), ) + bg = queryBackgroundColor(s) } - bg := term.BackgroundColor(pty.Slave, pty.Slave) - r := lipgloss.NewRenderer( - pty.Slave, - termenv.WithEnvironment(env), - termenv.WithColorCache(true), - ) c, ok := colorful.MakeColor(bg) if ok { _, _, l := c.Hsl() @@ -51,3 +59,20 @@ func newRenderer(s ssh.Session) *lipgloss.Renderer { } return r } + +// copied from x/exp/term +func queryBackgroundColor(s ssh.Session) (bg color.Color) { + _ = term.QueryTerminal(s, s, func(events []input.Event) bool { + for _, e := range events { + switch e := e.(type) { + case input.BackgroundColorEvent: + bg = e.Color + continue // we need to consume the next DA1 event + case input.PrimaryDeviceAttributesEvent: + return false + } + } + return true + }, ansi.RequestBackgroundColor+ansi.RequestPrimaryDeviceAttributes) + return +} diff --git a/examples/go.mod b/examples/go.mod index 7269281..d3caab6 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/charmbracelet/bubbles v0.18.0 - github.com/charmbracelet/bubbletea v0.26.0 + github.com/charmbracelet/bubbletea v0.26.1 github.com/charmbracelet/lipgloss v0.10.0 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/ssh v0.0.0-20240401141849-854cddfa2917 @@ -25,7 +25,7 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/keygen v0.5.0 // indirect github.com/charmbracelet/x/errors v0.0.0-20240117030013-d31dba354651 // indirect - github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd // indirect + github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/creack/pty v1.1.21 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect diff --git a/examples/go.sum b/examples/go.sum index 2da0d82..c35fc47 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -15,8 +15,8 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= -github.com/charmbracelet/bubbletea v0.26.0 h1:LRS2uBclVfqh3gWBmU8uso2fXBsroW2Nb6HtAHfzbJI= -github.com/charmbracelet/bubbletea v0.26.0/go.mod h1:FzKr7sKoO8iFVcdIBM9J0sJOcQv5nDQaYwsee3kpbgo= +github.com/charmbracelet/bubbletea v0.26.1 h1:xujcQeF73rh4jwu3+zhfQsvV18x+7zIjlw7/CYbzGJ0= +github.com/charmbracelet/bubbletea v0.26.1/go.mod h1:FzKr7sKoO8iFVcdIBM9J0sJOcQv5nDQaYwsee3kpbgo= github.com/charmbracelet/keygen v0.5.0 h1:XY0fsoYiCSM9axkrU+2ziE6u6YjJulo/b9Dghnw6MZc= github.com/charmbracelet/keygen v0.5.0/go.mod h1:DfvCgLHxZ9rJxdK0DGw3C/LkV4SgdGbnliHcObV3L+8= github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s= @@ -29,8 +29,8 @@ github.com/charmbracelet/x/editor v0.0.0-20240202113029-6ff29cf0473e h1:tBDIREfN github.com/charmbracelet/x/editor v0.0.0-20240202113029-6ff29cf0473e/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= github.com/charmbracelet/x/errors v0.0.0-20240117030013-d31dba354651 h1:3RXpZWGWTOeVXCTv0Dnzxdv/MhNUkBfEcbaTY0zrTQI= github.com/charmbracelet/x/errors v0.0.0-20240117030013-d31dba354651/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= -github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd h1:HqBjkSFXXfW4IgX3TMKipWoPEN08T3Pi4SA/3DLss/U= -github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd/go.mod h1:6GZ13FjIP6eOCqWU4lqgveGnYxQo9c3qBzHPeFu4HBE= +github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4 h1:zHstno0DfHRoZ+R+kPEDYYl/X16I3z9CO6j0nhGDKxw= +github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4/go.mod h1:yQqGHmheaQfkqiJWjklPHVAq1dKbk8uGbcoS/lcKCJ0= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= diff --git a/go.mod b/go.mod index c6c2a74..653d09f 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/charmbracelet/lipgloss v0.10.0 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/ssh v0.0.0-20240401141849-854cddfa2917 - github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd + github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4 github.com/go-git/go-git/v5 v5.12.0 github.com/google/go-cmp v0.6.0 github.com/hashicorp/golang-lru/v2 v2.0.7 diff --git a/go.sum b/go.sum index 4c04ff3..2cc0193 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/charmbracelet/ssh v0.0.0-20240401141849-854cddfa2917 h1:NZKjJ7d/pzk/A github.com/charmbracelet/ssh v0.0.0-20240401141849-854cddfa2917/go.mod h1:8/Ve8iGRRIGFM1kepYfRF2pEOF5Y3TEZYoJaA54228U= github.com/charmbracelet/x/errors v0.0.0-20240117030013-d31dba354651 h1:3RXpZWGWTOeVXCTv0Dnzxdv/MhNUkBfEcbaTY0zrTQI= github.com/charmbracelet/x/errors v0.0.0-20240117030013-d31dba354651/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= -github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd h1:HqBjkSFXXfW4IgX3TMKipWoPEN08T3Pi4SA/3DLss/U= -github.com/charmbracelet/x/exp/term v0.0.0-20240328150354-ab9afc214dfd/go.mod h1:6GZ13FjIP6eOCqWU4lqgveGnYxQo9c3qBzHPeFu4HBE= +github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4 h1:zHstno0DfHRoZ+R+kPEDYYl/X16I3z9CO6j0nhGDKxw= +github.com/charmbracelet/x/exp/term v0.0.0-20240503143715-36ea203beff4/go.mod h1:yQqGHmheaQfkqiJWjklPHVAq1dKbk8uGbcoS/lcKCJ0= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=