diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2021-04-09 20:16:35 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2021-04-09 22:50:55 +1000 |
commit | 93fac1f3124f87009091230f61cc13b5e5473cb5 (patch) | |
tree | e3ce82feb812357a3b325883ae00388f7f73aa57 /pkg | |
parent | d5504fa5d0d4e0312e1b27b8dbe3c6c664395a31 (diff) |
reduce flicker without worrying about carriage returns
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/gui/tasks_adapter.go | 14 | ||||
-rw-r--r-- | pkg/tasks/tasks.go | 14 |
2 files changed, 21 insertions, 7 deletions
diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go index bc2fb8a24..71cde5b00 100644 --- a/pkg/gui/tasks_adapter.go +++ b/pkg/gui/tasks_adapter.go @@ -83,13 +83,23 @@ func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager { gui.Log, view, func() { - view.Clear() + // we could clear here, but that actually has the effect of causing a flicker + // where the view may contain no content momentarily as the gui refreshes. + // Instead, we're rewinding the write pointer so that we will just start + // overwriting the existing content from the top down. Once we've reached + // the end of the content do display, we call view.FlushStaleCells() to + // clear out the remaining content from the previous render. + view.Reset() }, func() { gui.g.Update(func(*gocui.Gui) error { return nil }) - }) + }, + func() { + view.FlushStaleCells() + }, + ) gui.viewBufferManagerMap[view.Name()] = manager } diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index 5854b4f46..8287b3927 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -33,12 +33,13 @@ type ViewBufferManager struct { readLines chan int // beforeStart is the function that is called before starting a new task - beforeStart func() - refreshView func() + beforeStart func() + refreshView func() + flushStaleCells func() } -func NewViewBufferManager(log *logrus.Entry, writer io.Writer, beforeStart func(), refreshView func()) *ViewBufferManager { - return &ViewBufferManager{Log: log, writer: writer, beforeStart: beforeStart, refreshView: refreshView, readLines: make(chan int, 1024)} +func NewViewBufferManager(log *logrus.Entry, writer io.Writer, beforeStart func(), refreshView func(), flushStaleCells func()) *ViewBufferManager { + return &ViewBufferManager{Log: log, writer: writer, beforeStart: beforeStart, refreshView: refreshView, flushStaleCells: flushStaleCells, readLines: make(chan int, 1024)} } func (m *ViewBufferManager) ReadLines(n int) { @@ -75,7 +76,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string loaded := false go utils.Safe(func() { - ticker := time.NewTicker(time.Millisecond * 100) + ticker := time.NewTicker(time.Millisecond * 200) defer ticker.Stop() select { case <-ticker.C: @@ -114,6 +115,9 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string default: } if !ok { + // if we're here then there's nothing left to scan from the source + // so we're at the EOF and can flush the stale content + m.flushStaleCells() m.refreshView() break outer } |