summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evalbuffer.c6
-rw-r--r--src/testdir/dumps/Test_term_popup_bufline.dump15
-rw-r--r--src/testdir/test_popupwin.vim23
-rw-r--r--src/version.c2
4 files changed, 45 insertions, 1 deletions
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index 15ac58021..3527737b9 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -254,7 +254,11 @@ set_buffer_lines(
&& wp->w_cursor.lnum > append_lnum)
wp->w_cursor.lnum += added;
check_cursor_col();
- update_topline();
+
+ // Only update the window view if w_buffer matches curbuf, otherwise
+ // the computations will be wrong.
+ if (curwin->w_buffer == curbuf)
+ update_topline();
}
done:
diff --git a/src/testdir/dumps/Test_term_popup_bufline.dump b/src/testdir/dumps/Test_term_popup_bufline.dump
new file mode 100644
index 000000000..50ba4a6ec
--- /dev/null
+++ b/src/testdir/dumps/Test_term_popup_bufline.dump
@@ -0,0 +1,15 @@
+|1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @73
+>5| @35|0+0#0000001#ffd7ff255| +0#0000000#ffffff0@36
+|~+0#4040ff13&| @35|1+0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36
+|!+2#ffffff16#00e0003|s|e|q| |1| |5| |[|f|i|n|i|s|h|e|d|]| @17|2+0#0000001#ffd7ff255| +2#ffffff16#00e0003@18|5|,|1| @11|A|l@1
+| +0#0000000#ffffff0@36|3+0#0000001#ffd7ff255| +0#0000000#ffffff0@36
+|~+0#4040ff13&| @35|4+0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36
+|~| @35| +0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36
+|~| @73
+|~| @73
+|~| @73
+|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
+| +0&&@74
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 7cdd12865..5230fa3e1 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -4174,5 +4174,28 @@ func Test_bufdel_skips_popupwin_buffer()
call popup_close(id)
endfunc
+func Test_term_popup_bufline()
+ " very specific situation where a non-existing buffer line is used, leading
+ " to an ml_get error
+ CheckScreendump
+
+ let lines =<< trim END
+ vim9script
+ &scrolloff = 5
+ term_start('seq 1 5', {term_finish: 'open'})
+ timer_start(50, (_) => {
+ set cpoptions&vim
+ var buf = popup_create([], {})->winbufnr()
+ appendbufline(buf, 0, range(5))
+ })
+ END
+ call writefile(lines, 'XtestTermPopup', 'D')
+ let buf = RunVimInTerminal('-S XtestTermPopup', #{rows: 15})
+ call VerifyScreenDump(buf, 'Test_term_popup_bufline', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+endfunc
+
" vim: shiftwidth=2 sts=2
diff --git a/src/version.c b/src/version.c
index 28f7520f9..86924eddf 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 416,
+/**/
415,
/**/
414,