]> granicus.if.org Git - vim/commitdiff
patch 8.0.1164: changing StatusLine highlight does not always work v8.0.1164
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Sep 2017 14:00:14 +0000 (16:00 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Sep 2017 14:00:14 +0000 (16:00 +0200)
Problem:    Changing StatusLine highlight while evaluating 'statusline' may
            not change the status line color.
Solution:   When changing highlighting while redrawing don't cause another
            redraw. (suggested by Ozaki Kiichi, closes #2171, closes #2120)

src/buffer.c
src/syntax.c
src/version.c

index 7040bb1005721ebdf260b1c89ece1b9613cf3985..300582bd0ec50077f5604e0f332131fd99463c07 100644 (file)
@@ -3910,7 +3910,6 @@ build_stl_str_hl(
     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
     /*
@@ -4683,12 +4682,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;
+    /* When inside update_screen we do not want redrawing a stausline, ruler,
+     * title, etc. to trigger another redraw, it may cause an endless loop. */
+    if (updating_screen)
+    {
+       must_redraw = save_must_redraw;
+       curwin->w_redr_type = save_redr_type;
+    }
 
     return width;
 }
index 98109e77756cbc15f9be3a5bb54426571b284035..534d2d21df9d730a7ba559b0235277f18dd1662b 100644 (file)
@@ -7378,6 +7378,7 @@ do_highlight(
     int                id;
     int                idx;
     struct hl_group item_before;
+    int                did_change = FALSE;
     int                dodefault = FALSE;
     int                doclear = FALSE;
     int                dolink = FALSE;
@@ -7787,6 +7788,7 @@ do_highlight(
                /* GUI not started yet, always accept the name. */
                vim_free(HL_TABLE()[idx].sg_font_name);
                HL_TABLE()[idx].sg_font_name = vim_strsave(arg);
+               did_change = TRUE;
            }
            else
            {
@@ -7815,6 +7817,7 @@ do_highlight(
                    gui_mch_free_fontset(temp_sg_fontset);
                    vim_free(HL_TABLE()[idx].sg_font_name);
                    HL_TABLE()[idx].sg_font_name = vim_strsave(arg);
+                   did_change = TRUE;
                }
                else
                    HL_TABLE()[idx].sg_fontset = temp_sg_fontset;
@@ -7826,6 +7829,7 @@ do_highlight(
                    gui_mch_free_font(temp_sg_font);
                    vim_free(HL_TABLE()[idx].sg_font_name);
                    HL_TABLE()[idx].sg_font_name = vim_strsave(arg);
+                   did_change = TRUE;
                }
                else
                    HL_TABLE()[idx].sg_font = temp_sg_font;
@@ -7991,6 +7995,7 @@ do_highlight(
                            *namep = vim_strsave(arg);
                        else
                            *namep = NULL;
+                       did_change = TRUE;
                    }
 # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
 #  ifdef FEAT_GUI_X11
@@ -8041,6 +8046,7 @@ do_highlight(
                            *namep = vim_strsave(arg);
                        else
                            *namep = NULL;
+                       did_change = TRUE;
                    }
 # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
 #  ifdef FEAT_GUI_X11
@@ -8090,6 +8096,7 @@ do_highlight(
                            *namep = vim_strsave(arg);
                        else
                            *namep = NULL;
+                       did_change = TRUE;
                    }
 # ifdef FEAT_GUI
                }
@@ -8259,13 +8266,18 @@ do_highlight(
 
     /* Only call highlight_changed() once, after a sequence of highlight
      * commands, and only if an attribute actually changed. */
-    if (memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0
+    if ((did_change
+          || memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0)
 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
            && !did_highlight_changed
 #endif
        )
     {
-       redraw_all_later(NOT_VALID);
+       /* Do not trigger a redraw when highlighting is changed while
+        * redrawing.  This may happen when evaluating 'statusline' changes the
+        * StatusLine group. */
+       if (!updating_screen)
+           redraw_all_later(NOT_VALID);
        need_highlight_changed = TRUE;
     }
 }
index dc9be43c53147e543e656a2196790eb5883a5015..c055dd43794d61a7799636e5519cbc6a0a367905 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1164,
 /**/
     1163,
 /**/