diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2021-10-17 19:01:02 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2021-10-17 19:45:57 +1100 |
commit | d672b7342f12c64112cd6b59fb5e4286a7cb92b4 (patch) | |
tree | 4b4c51680b05217708ce7ca596b6a47ffc170838 /pkg/tasks/tasks.go | |
parent | e7c27b6f4aef44a2391dd207e1321008b5d1dcff (diff) |
stop resetting scroll all the time
Diffstat (limited to 'pkg/tasks/tasks.go')
-rw-r--r-- | pkg/tasks/tasks.go | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index 8287b3927..ba86317ac 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -31,15 +31,36 @@ type ViewBufferManager struct { Log *logrus.Entry newTaskId int readLines chan int + taskKey string + onNewKey func() // beforeStart is the function that is called before starting a new task - beforeStart func() - refreshView func() - flushStaleCells func() + beforeStart func() + refreshView func() + onEndOfInput func() } -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) GetTaskKey() string { + return m.taskKey +} + +func NewViewBufferManager( + log *logrus.Entry, + writer io.Writer, + beforeStart func(), + refreshView func(), + onEndOfInput func(), + onNewKey func(), +) *ViewBufferManager { + return &ViewBufferManager{ + Log: log, + writer: writer, + beforeStart: beforeStart, + refreshView: refreshView, + onEndOfInput: onEndOfInput, + readLines: make(chan int, 1024), + onNewKey: onNewKey, + } } func (m *ViewBufferManager) ReadLines(n int) { @@ -117,11 +138,11 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string 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.onEndOfInput() m.refreshView() break outer } - _, _ = m.writer.Write(append(scanner.Bytes(), []byte("\n")...)) + _, _ = m.writer.Write(append(scanner.Bytes(), '\n')) } m.refreshView() case <-stop: @@ -179,11 +200,17 @@ func (t *ViewBufferManager) Close() { // 1) command based, where the manager can be asked to read more lines, but the command can be killed // 2) string based, where the manager can also be asked to read more lines -func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error) error { +func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error, key string) error { go utils.Safe(func() { m.taskIDMutex.Lock() m.newTaskId++ taskID := m.newTaskId + + if m.GetTaskKey() != key && m.onNewKey != nil { + m.onNewKey() + } + m.taskKey = key + m.taskIDMutex.Unlock() m.waitingMutex.Lock() |