aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2017-03-22 02:13:54 +0100
committerJustin M. Keyes <justinkz@gmail.com>2017-03-22 18:43:01 +0100
commit54f31187ba006049ba455a1eeea4781750a3958d (patch)
treef28cdea12aee71a5b0394ca2a98d6b5e6c702a0e
parentf58a593cea3872c7b8b862375b6982436ee88ef2 (diff)
downloadrneovim-54f31187ba006049ba455a1eeea4781750a3958d.tar.gz
rneovim-54f31187ba006049ba455a1eeea4781750a3958d.tar.bz2
rneovim-54f31187ba006049ba455a1eeea4781750a3958d.zip
vim-patch:8.0.0482
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. https://github.com/vim/vim/commit/2c90d51123fba44a90e09aa4a4f2b7d972dadb94
-rw-r--r--src/nvim/testdir/test_functions.vim31
-rw-r--r--src/nvim/window.c3
2 files changed, 33 insertions, 1 deletions
diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim
new file mode 100644
index 0000000000..81cb6314ce
--- /dev/null
+++ b/src/nvim/testdir/test_functions.vim
@@ -0,0 +1,31 @@
+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
+
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 82e97ea00d..ebb998e3af 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -5377,7 +5377,8 @@ static int check_snapshot_rec(frame_T *sn, frame_T *fr)
|| (sn->fr_next != NULL
&& check_snapshot_rec(sn->fr_next, fr->fr_next) == FAIL)
|| (sn->fr_child != NULL
- && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL))
+ && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL)
+ || (sn->fr_win != NULL && !win_valid(sn->fr_win)))
return FAIL;
return OK;
}