summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-09-29 16:53:22 +0200
committerBram Moolenaar <Bram@vim.org>2015-09-29 16:53:22 +0200
commitba117c23dfd1146aca3235bea172df17a48bccee (patch)
tree7b2e28288b73908a6b81263df8d402bad9e7511d
parentc2b717ebd6719e722dcb5f10e4c74033a53ff7c7 (diff)
patch 7.4.888v7.4.888
Problem: The OptionSet autocommands are not triggered from setwinvar(). Solution: Do not use switch_win() when not needed. (Hirohito Higashi)
-rw-r--r--src/eval.c32
-rw-r--r--src/version.c2
2 files changed, 26 insertions, 8 deletions
diff --git a/src/eval.c b/src/eval.c
index 064e55f6f2..e12813c235 100644
--- 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;
- tabpage_T *oldtabpage;
int done = FALSE;
+#ifdef FEAT_WINDOWS
+ win_T *oldcurwin;
+ tabpage_T *oldtabpage;
+ 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
index 2efbd46165..32c4d14d03 100644
--- 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,