# HG changeset patch # User Christian Brabandt # Date 1443538804 -7200 # Node ID a01294e1c02f74242892815013f1cd1c1d06b232 # Parent 1d7ee63f3f106d3f565541623093b16f525d27cd commit https://github.com/vim/vim/commit/ba117c23dfd1146aca3235bea172df17a48bccee Author: Bram Moolenaar Date: Tue Sep 29 16:53:22 2015 +0200 patch 7.4.888 Problem: The OptionSet autocommands are not triggered from setwinvar(). Solution: Do not use switch_win() when not needed. (Hirohito Higashi) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -12420,12 +12420,16 @@ getwinvar(argvars, rettv, off) typval_T *rettv; int off; /* 1 for gettabwinvar() */ { - win_T *win, *oldcurwin; + win_T *win; char_u *varname; dictitem_T *v; tabpage_T *tp = NULL; + int done = FALSE; +#ifdef FEAT_WINDOWS + win_T *oldcurwin; tabpage_T *oldtabpage; - int done = FALSE; + int need_switch_win; +#endif #ifdef FEAT_WINDOWS if (off == 1) @@ -12442,9 +12446,14 @@ getwinvar(argvars, rettv, off) if (win != NULL && varname != NULL) { +#ifdef FEAT_WINDOWS /* Set curwin to be our win, temporarily. Also set the tabpage, - * otherwise the window is not valid. */ - if (switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE) == OK) + * otherwise the window is not valid. Only do this when needed, + * autocommands get blocked. */ + need_switch_win = !(tp == curtab && win == curwin); + if (!need_switch_win + || switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE) == OK) +#endif { if (*varname == '&') /* window-local-option */ { @@ -12465,8 +12474,11 @@ getwinvar(argvars, rettv, off) } } - /* restore previous notion of curwin */ - restore_win(oldcurwin, oldtabpage, TRUE); +#ifdef FEAT_WINDOWS + if (need_switch_win) + /* restore previous notion of curwin */ + restore_win(oldcurwin, oldtabpage, TRUE); +#endif } if (!done && argvars[off + 2].v_type != VAR_UNKNOWN) @@ -17597,6 +17609,7 @@ setwinvar(argvars, rettv, off) #ifdef FEAT_WINDOWS win_T *save_curwin; tabpage_T *save_curtab; + int need_switch_win; #endif char_u *varname, *winvarname; typval_T *varp; @@ -17619,7 +17632,9 @@ setwinvar(argvars, rettv, off) if (win != NULL && varname != NULL && varp != NULL) { #ifdef FEAT_WINDOWS - if (switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK) + need_switch_win = !(tp == curtab && win == curwin); + if (!need_switch_win + || switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK) #endif { if (*varname == '&') @@ -17647,7 +17662,8 @@ setwinvar(argvars, rettv, off) } } #ifdef FEAT_WINDOWS - restore_win(save_curwin, save_curtab, TRUE); + if (need_switch_win) + restore_win(save_curwin, save_curtab, TRUE); #endif } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 888, +/**/ 887, /**/ 886,