summaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2024-06-23 12:39:41 +0200
committerGitHub <noreply@github.com>2024-06-23 12:39:41 +0200
commitb2c457366af6bfed1c52292b091b1fe1a8e52722 (patch)
tree9fcd3195ade2f1ca173acec34f73d2eb92b4259b /pkg
parentc401f345302c96cb77b8c506ac74c6778d937e61 (diff)
parent8b8343b8a9f81c3000117ce869c734611cf87b7b (diff)
Fix PTY layout problems (#3658)
- **PR Description** This fixes two layout problems with pagers that draw a horizontal line across the entire width of the view (e.g. delta): - sometimes the width of that line was one character too long or too short in the staged changes view - when changing from a file or directory that has only staged or only unstaged changes to one that has both, the length of the horizontal line was totally off and only redraw correctly at the next refresh
Diffstat (limited to 'pkg')
-rw-r--r--pkg/gui/gui.go9
-rw-r--r--pkg/gui/gui_common.go7
-rw-r--r--pkg/gui/main_panels.go5
-rw-r--r--pkg/gui/pty.go13
4 files changed, 21 insertions, 13 deletions
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 5f2fd55bf..06228e759 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -959,3 +959,12 @@ func (gui *Gui) onWorker(f func(gocui.Task) error) {
func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions {
return gui.helpers.WindowArrangement.GetWindowDimensions(informationStr, appStatus)
}
+
+func (gui *Gui) afterLayout(f func() error) {
+ select {
+ case gui.afterLayoutFuncs <- f:
+ default:
+ // hopefully this never happens
+ gui.c.Log.Error("afterLayoutFuncs channel is full, skipping function")
+ }
+}
diff --git a/pkg/gui/gui_common.go b/pkg/gui/gui_common.go
index a75aa3658..434f4b38b 100644
--- a/pkg/gui/gui_common.go
+++ b/pkg/gui/gui_common.go
@@ -189,12 +189,7 @@ func (self *guiCommon) GetInitialKeybindingsWithCustomCommands() ([]*types.Bindi
}
func (self *guiCommon) AfterLayout(f func() error) {
- select {
- case self.gui.afterLayoutFuncs <- f:
- default:
- // hopefully this never happens
- self.gui.c.Log.Error("afterLayoutFuncs channel is full, skipping function")
- }
+ self.gui.afterLayout(f)
}
func (self *guiCommon) RunningIntegrationTest() bool {
diff --git a/pkg/gui/main_panels.go b/pkg/gui/main_panels.go
index bf30331cd..49d278399 100644
--- a/pkg/gui/main_panels.go
+++ b/pkg/gui/main_panels.go
@@ -20,7 +20,10 @@ func (gui *Gui) runTaskForView(view *gocui.View, task types.UpdateTask) error {
return gui.newCmdTask(view, v.Cmd, v.Prefix)
case *types.RunPtyTask:
- return gui.newPtyTask(view, v.Cmd, v.Prefix)
+ gui.afterLayout(func() error {
+ return gui.newPtyTask(view, v.Cmd, v.Prefix)
+ })
+ return nil
}
return nil
diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go
index cf3176f75..969e1aada 100644
--- a/pkg/gui/pty.go
+++ b/pkg/gui/pty.go
@@ -15,8 +15,8 @@ import (
"github.com/samber/lo"
)
-func (gui *Gui) desiredPtySize() *pty.Winsize {
- width, height := gui.Views.Main.Size()
+func (gui *Gui) desiredPtySize(view *gocui.View) *pty.Winsize {
+ width, height := view.Size()
return &pty.Winsize{Cols: uint16(width), Rows: uint16(height)}
}
@@ -25,11 +25,12 @@ func (gui *Gui) onResize() error {
gui.Mutexes.PtyMutex.Lock()
defer gui.Mutexes.PtyMutex.Unlock()
- for _, ptmx := range gui.viewPtmxMap {
+ for viewName, ptmx := range gui.viewPtmxMap {
// TODO: handle resizing properly: we need to actually clear the main view
// and re-read the output from our pty. Or we could just re-run the original
// command from scratch
- if err := pty.Setsize(ptmx, gui.desiredPtySize()); err != nil {
+ view, _ := gui.g.View(viewName)
+ if err := pty.Setsize(ptmx, gui.desiredPtySize(view)); err != nil {
return utils.WrapError(err)
}
}
@@ -44,7 +45,7 @@ func (gui *Gui) onResize() error {
// pseudo-terminal meaning we'll get the behaviour we want from the underlying
// command.
func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error {
- width, _ := gui.Views.Main.Size()
+ width, _ := view.Size()
pager := gui.git.Config.GetPager(width)
externalDiffCommand := gui.Config.GetUserConfig().Git.Paging.ExternalDiffCommand
@@ -69,7 +70,7 @@ func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error
var ptmx *os.File
start := func() (*exec.Cmd, io.Reader) {
var err error
- ptmx, err = pty.StartWithSize(cmd, gui.desiredPtySize())
+ ptmx, err = pty.StartWithSize(cmd, gui.desiredPtySize(view))
if err != nil {
gui.c.Log.Error(err)
}