diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2023-04-02 16:38:07 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-02 16:38:07 +1000 |
commit | a02b54e1b7e7e8dd8bc1958c11ef4ee4df459ea4 (patch) | |
tree | fc830b8319212d12bc27ef3af3f9fcf293f165d0 /pkg/gui | |
parent | e0503b9922dd5ae07f58dd9f871e7ec7f85031a4 (diff) | |
parent | 0af4e5a843f21bb2bc1caa6a24acf839df9c991a (diff) |
Merge pull request #2497 from stefanhaller/fix-initial-scroll-bar-size
Diffstat (limited to 'pkg/gui')
-rw-r--r-- | pkg/gui/pty.go | 6 | ||||
-rw-r--r-- | pkg/gui/tasks_adapter.go | 6 | ||||
-rw-r--r-- | pkg/gui/view_helpers.go | 28 |
3 files changed, 32 insertions, 8 deletions
diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go index 4a87c98da..fe53697c8 100644 --- a/pkg/gui/pty.go +++ b/pkg/gui/pty.go @@ -55,9 +55,6 @@ func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error cmd.Env = append(cmd.Env, "GIT_PAGER="+pager) - _, height := view.Size() - _, oy := view.Origin() - manager := gui.getManager(view) var ptmx *os.File @@ -82,7 +79,8 @@ func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error gui.Mutexes.PtyMutex.Unlock() } - if err := manager.NewTask(manager.NewCmdTask(start, prefix, height+oy+10, onClose), cmdStr); err != nil { + linesToRead := gui.linesToReadFromCmdTask(view) + if err := manager.NewTask(manager.NewCmdTask(start, prefix, linesToRead, onClose), cmdStr); err != nil { return err } diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go index 33aa09eb9..69b64d7b1 100644 --- a/pkg/gui/tasks_adapter.go +++ b/pkg/gui/tasks_adapter.go @@ -16,9 +16,6 @@ func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error cmdStr, ).Debug("RunCommand") - _, height := view.Size() - _, oy := view.Origin() - manager := gui.getManager(view) start := func() (*exec.Cmd, io.Reader) { @@ -35,7 +32,8 @@ func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error return cmd, r } - if err := manager.NewTask(manager.NewCmdTask(start, prefix, height+oy+10, nil), cmdStr); err != nil { + linesToRead := gui.linesToReadFromCmdTask(view) + if err := manager.NewTask(manager.NewCmdTask(start, prefix, linesToRead, nil), cmdStr); err != nil { gui.c.Log.Error(err) } diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index c51942b03..8f2055245 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -6,6 +6,7 @@ import ( "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/tasks" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/spkg/bom" ) @@ -15,6 +16,33 @@ func (gui *Gui) resetOrigin(v *gocui.View) error { return v.SetOrigin(0, 0) } +// Returns the number of lines that we should read initially from a cmd task so +// that the scrollbar has the correct size, along with the number of lines after +// which the view is filled and we can do a first refresh. +func (gui *Gui) linesToReadFromCmdTask(v *gocui.View) tasks.LinesToRead { + _, height := v.Size() + _, oy := v.Origin() + + linesForFirstRefresh := height + oy + 10 + + // We want to read as many lines initially as necessary to let the + // scrollbar go to its minimum height, so that the scrollbar thumb doesn't + // change size as you scroll down. + minScrollbarHeight := 2 + linesToReadForAccurateScrollbar := height*(height-1)/minScrollbarHeight + oy + + // However, cap it at some arbitrary max limit, so that we don't get + // performance problems for huge monitors or tiny font sizes + if linesToReadForAccurateScrollbar > 5000 { + linesToReadForAccurateScrollbar = 5000 + } + + return tasks.LinesToRead{ + Total: linesToReadForAccurateScrollbar, + InitialRefreshAfter: linesForFirstRefresh, + } +} + func (gui *Gui) cleanString(s string) string { output := string(bom.Clean([]byte(s))) return utils.NormalizeLinefeeds(output) |