diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-09-08 13:59:21 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-09-08 13:59:21 +0200 |
commit | ba2929b6afd2fc20479912a8dec789be26a38244 (patch) | |
tree | 22a2f34f3601b6860becfb3b7d9e5692f58cd3b7 /src | |
parent | 99433291b135094d9592c41f96d3ccd60073e2c1 (diff) | |
download | vim-git-ba2929b6afd2fc20479912a8dec789be26a38244.tar.gz |
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')
-rw-r--r-- | src/buffer.c | 22 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/buffer.c b/src/buffer.c index e95abfa5a..57330bfa1 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 */ diff --git a/src/version.c b/src/version.c index 2ffd91a50..9ec37eb66 100644 --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1073, +/**/ 1072, /**/ 1071, |