changeset 11191:445fd6be2009 v8.0.0482

patch 8.0.0482: the setbufvar() function may mess up the window layout commit https://github.com/vim/vim/commit/2c90d51123fba44a90e09aa4a4f2b7d972dadb94 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 18 22:35:30 2017 +0100 patch 8.0.0482: the setbufvar() function may mess up the window layout Problem: The setbufvar() function may mess up the window layout. (Kay Z.) Solution: Do not check the window to be valid if it is NULL.
author Christian Brabandt <cb@256bit.org>
date Sat, 18 Mar 2017 22:45:05 +0100
parents c175764745a0
children 988b6e9fd9d4
files src/testdir/test_functions.vim src/version.c src/window.c
diffstat 3 files changed, 34 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -725,3 +725,34 @@ func Test_balloon_show()
     call balloon_show('hi!')
   endif
 endfunc
+
+func Test_setbufvar_options()
+  " This tests that aucmd_prepbuf() and aucmd_restbuf() properly restore the
+  " window layout.
+  call assert_equal(1, winnr('$'))
+  split dummy_preview
+  resize 2
+  set winfixheight winfixwidth
+  let prev_id = win_getid()
+
+  wincmd j
+  let wh = winheight('.')
+  let dummy_buf = bufnr('dummy_buf1', v:true)
+  call setbufvar(dummy_buf, '&buftype', 'nofile')
+  execute 'belowright vertical split #' . dummy_buf
+  call assert_equal(wh, winheight('.'))
+  let dum1_id = win_getid()
+
+  wincmd h
+  let wh = winheight('.')
+  let dummy_buf = bufnr('dummy_buf2', v:true)
+  call setbufvar(dummy_buf, '&buftype', 'nofile')
+  execute 'belowright vertical split #' . dummy_buf
+  call assert_equal(wh, winheight('.'))
+
+  bwipe!
+  call win_gotoid(prev_id)
+  bwipe!
+  call win_gotoid(dum1_id)
+  bwipe!
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    482,
+/**/
     481,
 /**/
     480,
--- a/src/window.c
+++ b/src/window.c
@@ -6563,7 +6563,7 @@ check_snapshot_rec(frame_T *sn, frame_T 
 		&& check_snapshot_rec(sn->fr_next, fr->fr_next) == FAIL)
 	    || (sn->fr_child != NULL
 		&& check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL)
-	    || !win_valid(sn->fr_win))
+	    || (sn->fr_win != NULL && !win_valid(sn->fr_win)))
 	return FAIL;
     return OK;
 }