diff --git a/renderer.go b/renderer.go index 226e7e9..f7be9ed 100644 --- a/renderer.go +++ b/renderer.go @@ -146,6 +146,7 @@ func (r *renderer) flush() { defer r.mtx.Unlock() if r.linesRendered > 0 { + // Clear the lines we painted in the last render. for i := r.linesRendered; i > 0; i-- { @@ -160,6 +161,15 @@ func (r *renderer) flush() { } if _, exists := r.ignoreLines[0]; !exists { + // We need to return to the start of the line here to properly + // erase it. Going back the entire width of the terminal will + // usually be farther than we need to go, but terminal emulators + // will stop the cursor at the start of the line as a rule. + // + // We use this sequence in particular because it's part of the ANSI + // standard (whereas others are proprietary to, say, VT100/VT52). + cursorBack(out, r.width) + clearLine(out) } } diff --git a/screen.go b/screen.go index 2417dd3..097e65c 100644 --- a/screen.go +++ b/screen.go @@ -38,3 +38,7 @@ func restoreCursorPosition(w io.Writer) { func changeScrollingRegion(w io.Writer, top, bottom int) { fmt.Fprintf(w, te.CSI+te.ChangeScrollingRegionSeq, top, bottom) } + +func cursorBack(w io.Writer, n int) { + fmt.Fprintf(w, te.CSI+te.CursorBackSeq, n) +} diff --git a/tea.go b/tea.go index 0d9e258..5fe0fdf 100644 --- a/tea.go +++ b/tea.go @@ -197,14 +197,12 @@ func (p *Program) Start() error { } } -// AltScreen exits the altscreen. This is just a wrapper around the termenv -// function. +// AltScreen enters the alternate screen buffer. func AltScreen() { termenv.AltScreen() } -// ExitAltScreen exits the altscreen. This is just a wrapper around the termenv -// function. +// ExitAltScreen exits the alternate screen buffer. func ExitAltScreen() { termenv.ExitAltScreen() }