]> granicus.if.org Git - vim/commitdiff
patch 8.0.1160: getting tab-local variable fails after closing window v8.0.1160
authorBram Moolenaar <Bram@vim.org>
Fri, 29 Sep 2017 19:29:18 +0000 (21:29 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 29 Sep 2017 19:29:18 +0000 (21:29 +0200)
Problem:    Getting tab-local variable fails after closing window.
Solution:   set tp_firstwin and tp_lastwin. (Jason Franklin, closes #2170)

src/evalfunc.c
src/testdir/test_getvar.vim
src/version.c
src/window.c

index 7b019a53d74eda838ab80ea1d6440e09167d4f26..55d22951aab60c5b9ff310be48284000ad0348b0 100644 (file)
@@ -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. */
index 0f5dff5d10bf60b76db910b61328f6c4b79b6984..d6b6b69aa8143d06d0f9ba3e4b19179246ddf567 100644 (file)
@@ -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
index 5724b9d2b777efbe1857a71d5c6cc535a2967367..f2f5c167c9265c6d3ad0304daa3e2e59d7aefc6a 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1160,
 /**/
     1159,
 /**/
index a290807a0c46d9b0d722cf2c92ab441cad530fc1..96e32d8ef2ceec017e0c4d949db4f0c8e9a6f17b 100644 (file)
@@ -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();