summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2023-04-02 16:38:07 +1000
committerGitHub <noreply@github.com>2023-04-02 16:38:07 +1000
commita02b54e1b7e7e8dd8bc1958c11ef4ee4df459ea4 (patch)
treefc830b8319212d12bc27ef3af3f9fcf293f165d0 /pkg/gui
parente0503b9922dd5ae07f58dd9f871e7ec7f85031a4 (diff)
parent0af4e5a843f21bb2bc1caa6a24acf839df9c991a (diff)
Merge pull request #2497 from stefanhaller/fix-initial-scroll-bar-size
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/pty.go6
-rw-r--r--pkg/gui/tasks_adapter.go6
-rw-r--r--pkg/gui/view_helpers.go28
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)