# HG changeset patch # User Bram Moolenaar # Date 1371385108 -7200 # Node ID 0792cc5133ce1f37ad9e1d49804100b28d0a391b # Parent 454a6ebf1c194cb4c967229d6e4e20396db996c2 updated for version 7.3.1204 Problem: Calling gettabwinvar() in 'tabline' cancels Visual mode. (Hirohito Higashi) Solution: Don't always use goto_tabpage_tp(). diff --git a/src/eval.c b/src/eval.c --- 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 } } diff --git a/src/if_py_both.h b/src/if_py_both.h --- 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; diff --git a/src/proto/window.pro b/src/proto/window.pro --- 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)); diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/window.c b/src/window.c --- 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;