From a1651aec2f7955078741897d3d9441a51318ca7e Mon Sep 17 00:00:00 2001 From: Dmitry Maluka Date: Wed, 3 Mar 2021 20:51:06 +0100 Subject: [PATCH] Fix horizontal scrolling issue after toggling softwrap on/off Fixes #645 --- internal/buffer/buffer.go | 7 +++++++ internal/buffer/settings.go | 4 ++++ internal/display/bufwindow.go | 13 ++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 84ab7dc0..718510dd 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -189,6 +189,13 @@ type Buffer struct { cursors []*Cursor curCursor int StartCursor Loc + + // OptionCallback is called after a buffer option value is changed. + // The display module registers its OptionCallback to ensure the buffer window + // is properly updated when needed. This is a workaround for the fact that + // the buffer module cannot directly call the display's API (it would mean + // a circular dependency between packages). + OptionCallback func(option string, nativeValue interface{}) } // NewBufferFromFileAtLoc opens a new buffer with a given cursor location diff --git a/internal/buffer/settings.go b/internal/buffer/settings.go index e04d7061..c3ff428c 100644 --- a/internal/buffer/settings.go +++ b/internal/buffer/settings.go @@ -41,6 +41,10 @@ func (b *Buffer) SetOptionNative(option string, nativeValue interface{}) error { b.Type.Readonly = nativeValue.(bool) } + if b.OptionCallback != nil { + b.OptionCallback(option, nativeValue) + } + return nil } diff --git a/internal/display/bufwindow.go b/internal/display/bufwindow.go index 3c1136b1..0a9e174d 100644 --- a/internal/display/bufwindow.go +++ b/internal/display/bufwindow.go @@ -35,7 +35,8 @@ type BufWindow struct { func NewBufWindow(x, y, width, height int, buf *buffer.Buffer) *BufWindow { w := new(BufWindow) w.View = new(View) - w.X, w.Y, w.Width, w.Height, w.Buf = x, y, width, height, buf + w.X, w.Y, w.Width, w.Height = x, y, width, height + w.SetBuffer(buf) w.active = true w.sline = NewStatusLine(w) @@ -45,6 +46,16 @@ func NewBufWindow(x, y, width, height int, buf *buffer.Buffer) *BufWindow { func (w *BufWindow) SetBuffer(b *buffer.Buffer) { w.Buf = b + b.OptionCallback = func(option string, nativeValue interface{}) { + if option == "softwrap" { + if nativeValue.(bool) { + w.StartCol = 0 + } else { + w.StartLine.Row = 0 + } + w.Relocate() + } + } } func (w *BufWindow) GetView() *View {