diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2021-04-06 17:00:37 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2021-04-06 19:34:32 +1000 |
commit | 8eb802d3a090e16026ad0acfa69844f85229e2c1 (patch) | |
tree | 238de64d51a281896827f867ab5dcb92547af067 /vendor/github.com/jesseduffield/gocui/view.go | |
parent | 6fc031c523cfb8aa1a249997f76e24e8934b9a73 (diff) |
fix flicker issue in main view
Diffstat (limited to 'vendor/github.com/jesseduffield/gocui/view.go')
-rw-r--r-- | vendor/github.com/jesseduffield/gocui/view.go | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go index b13074242..2e4c4c1e3 100644 --- a/vendor/github.com/jesseduffield/gocui/view.go +++ b/vendor/github.com/jesseduffield/gocui/view.go @@ -518,16 +518,20 @@ func (v *View) writeCells(x, y int, cells []cell) { // of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must // be called to clear the view's buffer. func (v *View) Write(p []byte) (n int, err error) { - v.tainted = true v.writeMutex.Lock() + defer v.writeMutex.Unlock() + + v.tainted = true v.makeWriteable(v.wx, v.wy) v.writeRunes(bytes.Runes(p)) - v.writeMutex.Unlock() return len(p), nil } func (v *View) WriteRunes(p []rune) { + v.writeMutex.Lock() + defer v.writeMutex.Unlock() + v.tainted = true // Fill with empty cells, if writing outside current view buffer @@ -545,6 +549,8 @@ func (v *View) writeRunes(p []rune) { for _, r := range p { switch r { case '\n': + // clear the rest of the line + v.lines[v.wy] = v.lines[v.wy][0:v.wx] v.wy++ if v.wy >= len(v.lines) { v.lines = append(v.lines, nil) @@ -642,6 +648,15 @@ func (v *View) Read(p []byte) (n int, err error) { // Rewind sets read and write pos to (0, 0). 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 { // SetReadPos returns error only if x and y are negative // we are passing 0, 0, thus no error should occur. @@ -832,13 +847,31 @@ func (v *View) realPosition(vx, vy int) (x, y int, err error) { // And resets reading and writing offsets. func (v *View) Clear() { v.writeMutex.Lock() - v.Rewind() + defer v.writeMutex.Unlock() + + v.rewind() v.tainted = true - v.ei.reset() v.lines = nil v.viewLines = nil 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. |