revert no-flicker due to carriage return weirdness

This commit is contained in:
Jesse Duffield 2021-04-08 23:09:02 +10:00
parent 21049be233
commit b03e2270a0
6 changed files with 14 additions and 65 deletions

2
go.mod
View file

@ -20,7 +20,7 @@ require (
github.com/imdario/mergo v0.3.11 github.com/imdario/mergo v0.3.11
github.com/integrii/flaggy v1.4.0 github.com/integrii/flaggy v1.4.0
github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4 github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4
github.com/jesseduffield/gocui v0.3.1-0.20210406065942-1b0c68414064 github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe // indirect github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe // indirect
github.com/jesseduffield/yaml v2.1.0+incompatible github.com/jesseduffield/yaml v2.1.0+incompatible
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0

4
go.sum
View file

@ -102,10 +102,6 @@ github.com/jesseduffield/gocui v0.3.1-0.20210405041826-439abd8b6e07 h1:BymGR28au
github.com/jesseduffield/gocui v0.3.1-0.20210405041826-439abd8b6e07/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg= github.com/jesseduffield/gocui v0.3.1-0.20210405041826-439abd8b6e07/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg=
github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772 h1:dg9krj10Udac4IcvlVCOAPktQkfggkgtqRmbDKk7Pzw= github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772 h1:dg9krj10Udac4IcvlVCOAPktQkfggkgtqRmbDKk7Pzw=
github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg= github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg=
github.com/jesseduffield/gocui v0.3.1-0.20210406065811-95ef6e13779b h1:3+4+muhhikpls5FePXSRNFgcdoPx8dTdqaCy3AqLz98=
github.com/jesseduffield/gocui v0.3.1-0.20210406065811-95ef6e13779b/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg=
github.com/jesseduffield/gocui v0.3.1-0.20210406065942-1b0c68414064 h1:Oe+QJuUIOd2TU+A3BW5sT1eXqceoBcOOfyoHlGf7F8Y=
github.com/jesseduffield/gocui v0.3.1-0.20210406065942-1b0c68414064/go.mod h1:QWq79xplEoyhQO+dgpk3sojjTVRKjQklyTlzm5nC5Kg=
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe h1:qsVhCf2RFyyKIUe/+gJblbCpXMUki9rZrHuEctg6M/E= github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe h1:qsVhCf2RFyyKIUe/+gJblbCpXMUki9rZrHuEctg6M/E=
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe/go.mod h1:anMibpZtqNxjDbxrcDEAwSdaJ37vyUeM1f/M4uekib4= github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe/go.mod h1:anMibpZtqNxjDbxrcDEAwSdaJ37vyUeM1f/M4uekib4=
github.com/jesseduffield/yaml v2.1.0+incompatible h1:HWQJ1gIv2zHKbDYNp0Jwjlj24K8aqpFHnMCynY1EpmE= github.com/jesseduffield/yaml v2.1.0+incompatible h1:HWQJ1gIv2zHKbDYNp0Jwjlj24K8aqpFHnMCynY1EpmE=

View file

@ -83,23 +83,13 @@ func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager {
gui.Log, gui.Log,
view, view,
func() { func() {
// we could clear here, but that actually has the effect of causing a flicker view.Clear()
// 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.Rewind()
}, },
func() { func() {
gui.g.Update(func(*gocui.Gui) error { gui.g.Update(func(*gocui.Gui) error {
return nil return nil
}) })
}, })
func() {
view.FlushStaleCells()
},
)
gui.viewBufferManagerMap[view.Name()] = manager gui.viewBufferManagerMap[view.Name()] = manager
} }

View file

@ -33,13 +33,12 @@ type ViewBufferManager struct {
readLines chan int readLines chan int
// beforeStart is the function that is called before starting a new task // beforeStart is the function that is called before starting a new task
beforeStart func() beforeStart func()
refreshView func() refreshView func()
flushStaleCells func()
} }
func NewViewBufferManager(log *logrus.Entry, writer io.Writer, beforeStart func(), refreshView func(), flushStaleCells func()) *ViewBufferManager { func NewViewBufferManager(log *logrus.Entry, writer io.Writer, beforeStart func(), refreshView func()) *ViewBufferManager {
return &ViewBufferManager{Log: log, writer: writer, beforeStart: beforeStart, refreshView: refreshView, flushStaleCells: flushStaleCells, readLines: make(chan int, 1024)} return &ViewBufferManager{Log: log, writer: writer, beforeStart: beforeStart, refreshView: refreshView, readLines: make(chan int, 1024)}
} }
func (m *ViewBufferManager) ReadLines(n int) { func (m *ViewBufferManager) ReadLines(n int) {
@ -76,7 +75,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string
loaded := false loaded := false
go utils.Safe(func() { go utils.Safe(func() {
ticker := time.NewTicker(time.Millisecond * 200) ticker := time.NewTicker(time.Millisecond * 100)
defer ticker.Stop() defer ticker.Stop()
select { select {
case <-ticker.C: case <-ticker.C:
@ -115,9 +114,6 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string
default: default:
} }
if !ok { 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() m.refreshView()
break outer break outer
} }

View file

@ -518,20 +518,16 @@ func (v *View) writeCells(x, y int, cells []cell) {
// of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must // of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must
// be called to clear the view's buffer. // be called to clear the view's buffer.
func (v *View) Write(p []byte) (n int, err error) { func (v *View) Write(p []byte) (n int, err error) {
v.writeMutex.Lock()
defer v.writeMutex.Unlock()
v.tainted = true v.tainted = true
v.writeMutex.Lock()
v.makeWriteable(v.wx, v.wy) v.makeWriteable(v.wx, v.wy)
v.writeRunes(bytes.Runes(p)) v.writeRunes(bytes.Runes(p))
v.writeMutex.Unlock()
return len(p), nil return len(p), nil
} }
func (v *View) WriteRunes(p []rune) { func (v *View) WriteRunes(p []rune) {
v.writeMutex.Lock()
defer v.writeMutex.Unlock()
v.tainted = true v.tainted = true
// Fill with empty cells, if writing outside current view buffer // Fill with empty cells, if writing outside current view buffer
@ -549,8 +545,6 @@ func (v *View) writeRunes(p []rune) {
for _, r := range p { for _, r := range p {
switch r { switch r {
case '\n': case '\n':
// clear the rest of the line
v.lines[v.wy] = v.lines[v.wy][0:v.wx]
v.wy++ v.wy++
if v.wy >= len(v.lines) { if v.wy >= len(v.lines) {
v.lines = append(v.lines, nil) v.lines = append(v.lines, nil)
@ -648,15 +642,6 @@ func (v *View) Read(p []byte) (n int, err error) {
// Rewind sets read and write pos to (0, 0). // Rewind sets read and write pos to (0, 0).
func (v *View) Rewind() { func (v *View) Rewind() {
v.writeMutex.Lock()
defer v.writeMutex.Unlock()
v.rewind()
}
func (v *View) rewind() {
v.ei.reset()
if err := v.SetReadPos(0, 0); err != nil { if err := v.SetReadPos(0, 0); err != nil {
// SetReadPos returns error only if x and y are negative // SetReadPos returns error only if x and y are negative
// we are passing 0, 0, thus no error should occur. // we are passing 0, 0, thus no error should occur.
@ -847,31 +832,13 @@ func (v *View) realPosition(vx, vy int) (x, y int, err error) {
// And resets reading and writing offsets. // And resets reading and writing offsets.
func (v *View) Clear() { func (v *View) Clear() {
v.writeMutex.Lock() v.writeMutex.Lock()
defer v.writeMutex.Unlock() v.Rewind()
v.rewind()
v.tainted = true v.tainted = true
v.ei.reset()
v.lines = nil v.lines = nil
v.viewLines = nil v.viewLines = nil
v.clearRunes() v.clearRunes()
} v.writeMutex.Unlock()
// This is for when we've done a rewind for the sake of avoiding a flicker and
// we've reached the end of the new content to display: we need to clear the remaining
// content from the previous round.
func (v *View) FlushStaleCells() {
v.writeMutex.Lock()
defer v.writeMutex.Unlock()
// need to wipe the end of the current line and all following lines
if len(v.lines) > 0 && v.wy < len(v.lines) {
// why this needs to be +1 but the 0:v.wx part doesn't, I'm not sure
v.lines = v.lines[0 : v.wy+1]
if len(v.lines[v.wy]) > 0 && v.wx < len(v.lines[v.wy]) {
v.lines[v.wy] = v.lines[v.wy][0:v.wx]
}
}
} }
// clearRunes erases all the cells in the view. // clearRunes erases all the cells in the view.

2
vendor/modules.txt vendored
View file

@ -149,7 +149,7 @@ github.com/jesseduffield/go-git/v5/utils/merkletrie/filesystem
github.com/jesseduffield/go-git/v5/utils/merkletrie/index github.com/jesseduffield/go-git/v5/utils/merkletrie/index
github.com/jesseduffield/go-git/v5/utils/merkletrie/internal/frame github.com/jesseduffield/go-git/v5/utils/merkletrie/internal/frame
github.com/jesseduffield/go-git/v5/utils/merkletrie/noder github.com/jesseduffield/go-git/v5/utils/merkletrie/noder
# github.com/jesseduffield/gocui v0.3.1-0.20210406065942-1b0c68414064 # github.com/jesseduffield/gocui v0.3.1-0.20210405093708-e79dab8f7772
## explicit ## explicit
github.com/jesseduffield/gocui github.com/jesseduffield/gocui
# github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe # github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe