changeset 4918:0792cc5133ce v7.3.1204

updated for version 7.3.1204 Problem: Calling gettabwinvar() in 'tabline' cancels Visual mode. (Hirohito Higashi) Solution: Don't always use goto_tabpage_tp().
author Bram Moolenaar <bram@vim.org>
date Sun, 16 Jun 2013 14:18:28 +0200
parents 454a6ebf1c19
children bfe6cba23b88
files src/eval.c src/if_py_both.h src/proto/window.pro src/version.c src/window.c
diffstat 5 files changed, 42 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -11952,7 +11952,7 @@ getwinvar(argvars, rettv, off)
     {
 	/* Set curwin to be our win, temporarily.  Also set the tabpage,
 	 * otherwise the window is not valid. */
-	switch_win(&oldcurwin, &oldtabpage, win, tp);
+	switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE);
 
 	if (*varname == '&')	/* window-local-option */
 	{
@@ -11972,7 +11972,7 @@ getwinvar(argvars, rettv, off)
 	}
 
 	/* restore previous notion of curwin */
-	restore_win(oldcurwin, oldtabpage);
+	restore_win(oldcurwin, oldtabpage, TRUE);
     }
 
     if (!done && argvars[off + 2].v_type != VAR_UNKNOWN)
@@ -16775,7 +16775,7 @@ setwinvar(argvars, rettv, off)
     if (win != NULL && varname != NULL && varp != NULL)
     {
 #ifdef FEAT_WINDOWS
-	if (switch_win(&save_curwin, &save_curtab, win, tp) == FAIL)
+	if (switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == FAIL)
 	    return;
 #endif
 
@@ -16804,7 +16804,7 @@ setwinvar(argvars, rettv, off)
 	}
 
 #ifdef FEAT_WINDOWS
-	restore_win(save_curwin, save_curtab);
+	restore_win(save_curwin, save_curtab, TRUE);
 #endif
     }
 }
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -2706,7 +2706,7 @@ set_option_value_for(key, numval, string
     {
 	case SREQ_WIN:
 	    if (switch_win(&save_curwin, &save_curtab, (win_T *)from,
-				     win_find_tabpage((win_T *)from)) == FAIL)
+			      win_find_tabpage((win_T *)from), FALSE) == FAIL)
 	    {
 		if (VimTryEnd())
 		    return -1;
@@ -2714,7 +2714,7 @@ set_option_value_for(key, numval, string
 		return -1;
 	    }
 	    r = set_option_value_err(key, numval, stringval, opt_flags);
-	    restore_win(save_curwin, save_curtab);
+	    restore_win(save_curwin, save_curtab, FALSE);
 	    if (r == FAIL)
 		return -1;
 	    break;
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -70,8 +70,8 @@ int only_one_window __ARGS((void));
 void check_lnums __ARGS((int do_curwin));
 void make_snapshot __ARGS((int idx));
 void restore_snapshot __ARGS((int idx, int close_curwin));
-int switch_win __ARGS((win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage_T *tp));
-void restore_win __ARGS((win_T *save_curwin, tabpage_T *save_curtab));
+int switch_win __ARGS((win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage_T *tp, int no_display));
+void restore_win __ARGS((win_T *save_curwin, tabpage_T *save_curtab, int no_display));
 void switch_buffer __ARGS((buf_T **save_curbuf, buf_T *buf));
 void restore_buffer __ARGS((buf_T *save_curbuf));
 int win_hasvertsplit __ARGS((void));
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1204,
+/**/
     1203,
 /**/
     1202,
--- a/src/window.c
+++ b/src/window.c
@@ -3774,7 +3774,8 @@ enter_tabpage(tp, old_curbuf, trigger_en
     /* We would like doing the TabEnter event first, but we don't have a
      * valid current window yet, which may break some commands.
      * This triggers autocommands, thus may make "tp" invalid. */
-    win_enter_ext(tp->tp_curwin, FALSE, TRUE, trigger_enter_autocmds, trigger_leave_autocmds);
+    win_enter_ext(tp->tp_curwin, FALSE, TRUE,
+			      trigger_enter_autocmds, trigger_leave_autocmds);
     prevwin = next_prevwin;
 
     last_status(FALSE);		/* status line may appear or disappear */
@@ -6575,14 +6576,17 @@ restore_snapshot_rec(sn, fr)
  * Set "win" to be the curwin and "tp" to be the current tab page.
  * restore_win() MUST be called to undo.
  * No autocommands will be executed.
+ * When "no_display" is TRUE the display won't be affected, no redraw is
+ * triggered, another tabpage access is limited.
  * Returns FAIL if switching to "win" failed.
  */
     int
-switch_win(save_curwin, save_curtab, win, tp)
+switch_win(save_curwin, save_curtab, win, tp, no_display)
     win_T	**save_curwin;
     tabpage_T	**save_curtab;
     win_T	*win;
     tabpage_T	*tp;
+    int		no_display;
 {
 # ifdef FEAT_AUTOCMD
     block_autocmds();
@@ -6592,7 +6596,16 @@ switch_win(save_curwin, save_curtab, win
     if (tp != NULL)
     {
 	*save_curtab = curtab;
-	goto_tabpage_tp(tp, FALSE, FALSE);
+	if (no_display)
+	{
+	    curtab->tp_firstwin = firstwin;
+	    curtab->tp_lastwin = lastwin;
+	    curtab = tp;
+	    firstwin = curtab->tp_firstwin;
+	    lastwin = curtab->tp_lastwin;
+	}
+	else
+	    goto_tabpage_tp(tp, FALSE, FALSE);
     }
     if (!win_valid(win))
     {
@@ -6609,15 +6622,29 @@ switch_win(save_curwin, save_curtab, win
 
 /*
  * Restore current tabpage and window saved by switch_win(), if still valid.
+ * When "no_display" is TRUE the display won't be affected, no redraw is
+ * triggered.
  */
     void
-restore_win(save_curwin, save_curtab)
+restore_win(save_curwin, save_curtab, no_display)
     win_T	*save_curwin;
     tabpage_T	*save_curtab;
+    int		no_display;
 {
 # ifdef FEAT_WINDOWS
     if (save_curtab != NULL && valid_tabpage(save_curtab))
-	goto_tabpage_tp(save_curtab, FALSE, FALSE);
+    {
+	if (no_display)
+	{
+	    curtab->tp_firstwin = firstwin;
+	    curtab->tp_lastwin = lastwin;
+	    curtab = save_curtab;
+	    firstwin = curtab->tp_firstwin;
+	    lastwin = curtab->tp_lastwin;
+	}
+	else
+	    goto_tabpage_tp(save_curtab, FALSE, FALSE);
+    }
     if (win_valid(save_curwin))
     {
 	curwin = save_curwin;