diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-09-29 21:29:18 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-09-29 21:29:18 +0200 |
commit | 816968defc8ae79eb7e2319e991e74661be8d750 (patch) | |
tree | ddb01de7db656fdbd9f673e54785860c93379cf7 | |
parent | d371bbe0ab4b07dd3aa8d0f77905d222f6c5fd7e (diff) | |
download | vim-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.c | 4 | ||||
-rw-r--r-- | src/testdir/test_getvar.vim | 16 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 15 |
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(); |