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
This commit is contained in:
Stefan Haller 2024-06-23 12:39:41 +02:00 committed by GitHub
commit b2c457366a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 13 deletions

View file

@ -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")
}
}

View file

@ -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 {

View file

@ -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

View file

@ -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)
}