Mercurial > vim
changeset 7154:a01294e1c02f v7.4.888
commit https://github.com/vim/vim/commit/ba117c23dfd1146aca3235bea172df17a48bccee
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 29 Sep 2015 17:00:04 +0200 |
parents | 1d7ee63f3f10 |
children | 410c1fa3d0d5 |
files | src/eval.c src/version.c |
diffstat | 2 files changed, 26 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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 } }