summaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-08 13:59:21 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-08 13:59:21 +0200
commitba2929b6afd2fc20479912a8dec789be26a38244 (patch)
tree22a2f34f3601b6860becfb3b7d9e5692f58cd3b7 /src/buffer.c
parent99433291b135094d9592c41f96d3ccd60073e2c1 (diff)
patch 8.0.1073: may get an endless loop if 'statusline' changes a highlightv8.0.1073
Problem: May get an endless loop if 'statusline' changes a highlight. Solution: Do not let evaluating 'statusline' trigger a redraw.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/buffer.c b/src/buffer.c
index e95abfa5af..57330bfa14 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3915,8 +3915,8 @@ build_stl_str_hl(
char_u *t;
int byteval;
#ifdef FEAT_EVAL
- win_T *o_curwin;
- buf_T *o_curbuf;
+ win_T *save_curwin;
+ buf_T *save_curbuf;
#endif
int empty_line;
colnr_T virtcol;
@@ -3958,6 +3958,9 @@ build_stl_str_hl(
char_u tmp[TMPLEN];
char_u *usefmt = fmt;
struct stl_hlrec *sp;
+ int save_must_redraw = must_redraw;
+ int save_redr_type = curwin->w_redr_type;
+ int save_highlight_shcnaged = need_highlight_changed;
#ifdef FEAT_EVAL
/*
@@ -4267,15 +4270,15 @@ build_stl_str_hl(
vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
set_internal_string_var((char_u *)"actual_curbuf", tmp);
- o_curbuf = curbuf;
- o_curwin = curwin;
+ save_curbuf = curbuf;
+ save_curwin = curwin;
curwin = wp;
curbuf = wp->w_buffer;
str = eval_to_string_safe(p, &t, use_sandbox);
- curwin = o_curwin;
- curbuf = o_curbuf;
+ curwin = save_curwin;
+ curbuf = save_curbuf;
do_unlet((char_u *)"g:actual_curbuf", TRUE);
if (str != NULL && *str != 0)
@@ -4730,6 +4733,13 @@ build_stl_str_hl(
sp->userhl = 0;
}
+ /* We do not want redrawing a stausline, ruler, title, etc. to trigger
+ * another redraw, it may cause an endless loop. This happens when a
+ * statusline changes a highlight group. */
+ must_redraw = save_must_redraw;
+ curwin->w_redr_type = save_redr_type;
+ need_highlight_changed = save_highlight_shcnaged;
+
return width;
}
#endif /* FEAT_STL_OPT */