summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-29 21:29:18 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-29 21:29:18 +0200
commit816968defc8ae79eb7e2319e991e74661be8d750 (patch)
treeddb01de7db656fdbd9f673e54785860c93379cf7
parentd371bbe0ab4b07dd3aa8d0f77905d222f6c5fd7e (diff)
downloadvim-816968defc8ae79eb7e2319e991e74661be8d750.zip
patch 8.0.1160: getting tab-local variable fails after closing window
Problem: Getting tab-local variable fails after closing window. Solution: set tp_firstwin and tp_lastwin. (Jason Franklin, closes #2170)
-rw-r--r--src/evalfunc.c4
-rw-r--r--src/testdir/test_getvar.vim16
-rw-r--r--src/version.c2
-rw-r--r--src/window.c15
4 files changed, 28 insertions, 9 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 7b019a53d..55d22951a 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5183,8 +5183,8 @@ f_gettabvar(typval_T *argvars, typval_T *rettv)
/* Set tp to be our tabpage, temporarily. Also set the window to the
* first window in the tabpage, otherwise the window is not valid. */
if (switch_win(&oldcurwin, &oldtabpage,
- tp->tp_firstwin == NULL ? firstwin : tp->tp_firstwin, tp, TRUE)
- == OK)
+ tp == curtab || tp->tp_firstwin == NULL ? firstwin
+ : tp->tp_firstwin, tp, TRUE) == OK)
{
/* look up the variable */
/* Let gettabvar({nr}, "") return the "t:" dictionary. */
diff --git a/src/testdir/test_getvar.vim b/src/testdir/test_getvar.vim
index 0f5dff5d1..d6b6b69aa 100644
--- a/src/testdir/test_getvar.vim
+++ b/src/testdir/test_getvar.vim
@@ -86,3 +86,19 @@ func Test_var()
call assert_equal(1, gettabwinvar(2, 3, '&nux', 1))
tabonly
endfunc
+
+" It was discovered that "gettabvar()" would fail if called from within the
+" tabline when the user closed a window. This test confirms the fix.
+func Test_gettabvar_in_tabline()
+ let t:var_str = 'value'
+
+ set tabline=%{assert_equal('value',gettabvar(1,'var_str'))}
+ set showtabline=2
+
+ " Simulate the user opening a split (which becomes window #1) and then
+ " closing the split, which triggers the redrawing of the tabline.
+ leftabove split
+ redrawstatus!
+ close
+ redrawstatus!
+endfunc
diff --git a/src/version.c b/src/version.c
index 5724b9d2b..f2f5c167c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1160,
+/**/
1159,
/**/
1158,
diff --git a/src/window.c b/src/window.c
index a290807a0..96e32d8ef 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4775,13 +4775,14 @@ win_remove(
if (wp->w_prev != NULL)
wp->w_prev->w_next = wp->w_next;
else if (tp == NULL)
- firstwin = wp->w_next;
+ firstwin = curtab->tp_firstwin = wp->w_next;
else
tp->tp_firstwin = wp->w_next;
+
if (wp->w_next != NULL)
wp->w_next->w_prev = wp->w_prev;
else if (tp == NULL)
- lastwin = wp->w_prev;
+ lastwin = curtab->tp_lastwin = wp->w_prev;
else
tp->tp_lastwin = wp->w_prev;
}
@@ -6597,11 +6598,11 @@ restore_snapshot_rec(frame_T *sn, frame_T *fr)
*/
int
switch_win(
- win_T **save_curwin UNUSED,
- tabpage_T **save_curtab UNUSED,
- win_T *win UNUSED,
- tabpage_T *tp UNUSED,
- int no_display UNUSED)
+ win_T **save_curwin,
+ tabpage_T **save_curtab,
+ win_T *win,
+ tabpage_T *tp,
+ int no_display)
{
# ifdef FEAT_AUTOCMD
block_autocmds();