Merge #10368 from janlazo/vim-8.0.1164

vim-patch:8.0.{755,1146,1164}
This commit is contained in:
Justin M. Keyes
2019-07-19 00:39:50 +02:00
committed by GitHub
2 changed files with 51 additions and 30 deletions

View File

@@ -3366,7 +3366,6 @@ int build_stl_str_hl(
char_u *usefmt = fmt; char_u *usefmt = fmt;
const int save_must_redraw = must_redraw; const int save_must_redraw = must_redraw;
const int save_redr_type = curwin->w_redr_type; const int save_redr_type = curwin->w_redr_type;
const int save_highlight_shcnaged = need_highlight_changed;
// When the format starts with "%!" then evaluate it as an expression and // When the format starts with "%!" then evaluate it as an expression and
// use the result as the actual format string. // use the result as the actual format string.
@@ -4430,12 +4429,12 @@ int build_stl_str_hl(
cur_tab_rec->def.func = NULL; cur_tab_rec->def.func = NULL;
} }
// We do not want redrawing a stausline, ruler, title, etc. to trigger // When inside update_screen we do not want redrawing a stausline, ruler,
// another redraw, it may cause an endless loop. This happens when a // title, etc. to trigger another redraw, it may cause an endless loop.
// statusline changes a highlight group. if (updating_screen) {
must_redraw = save_must_redraw; must_redraw = save_must_redraw;
curwin->w_redr_type = save_redr_type; curwin->w_redr_type = save_redr_type;
need_highlight_changed = save_highlight_shcnaged; }
return width; return width;
} }

View File

@@ -6474,6 +6474,7 @@ void do_highlight(const char *line, const bool forceit, const bool init)
int id; int id;
int idx; int idx;
struct hl_group item_before; struct hl_group item_before;
bool did_change = false;
bool dodefault = false; bool dodefault = false;
bool doclear = false; bool doclear = false;
bool dolink = false; bool dolink = false;
@@ -6830,57 +6831,72 @@ void do_highlight(const char *line, const bool forceit, const bool init)
} }
} }
} else if (strcmp(key, "GUIFG") == 0) { } else if (strcmp(key, "GUIFG") == 0) {
char_u **const namep = &HL_TABLE()[idx].sg_rgb_fg_name;
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) { if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
if (!init) { if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI; HL_TABLE()[idx].sg_set |= SG_GUI;
} }
xfree(HL_TABLE()[idx].sg_rgb_fg_name); if (*namep == NULL || STRCMP(*namep, arg) != 0) {
if (strcmp(arg, "NONE")) { xfree(*namep);
HL_TABLE()[idx].sg_rgb_fg_name = (char_u *)xstrdup((char *)arg); if (strcmp(arg, "NONE") != 0) {
HL_TABLE()[idx].sg_rgb_fg = name_to_color((const char_u *)arg); *namep = (char_u *)xstrdup(arg);
HL_TABLE()[idx].sg_rgb_fg = name_to_color((char_u *)arg);
} else { } else {
HL_TABLE()[idx].sg_rgb_fg_name = NULL; *namep = NULL;
HL_TABLE()[idx].sg_rgb_fg = -1; HL_TABLE()[idx].sg_rgb_fg = -1;
} }
did_change = true;
}
} }
if (is_normal_group) { if (is_normal_group) {
normal_fg = HL_TABLE()[idx].sg_rgb_fg; normal_fg = HL_TABLE()[idx].sg_rgb_fg;
} }
} else if (STRCMP(key, "GUIBG") == 0) { } else if (STRCMP(key, "GUIBG") == 0) {
char_u **const namep = &HL_TABLE()[idx].sg_rgb_bg_name;
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) { if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
if (!init) { if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI; HL_TABLE()[idx].sg_set |= SG_GUI;
} }
xfree(HL_TABLE()[idx].sg_rgb_bg_name); if (*namep == NULL || STRCMP(*namep, arg) != 0) {
xfree(*namep);
if (STRCMP(arg, "NONE") != 0) { if (STRCMP(arg, "NONE") != 0) {
HL_TABLE()[idx].sg_rgb_bg_name = (char_u *)xstrdup((char *)arg); *namep = (char_u *)xstrdup(arg);
HL_TABLE()[idx].sg_rgb_bg = name_to_color((const char_u *)arg); HL_TABLE()[idx].sg_rgb_bg = name_to_color((char_u *)arg);
} else { } else {
HL_TABLE()[idx].sg_rgb_bg_name = NULL; *namep = NULL;
HL_TABLE()[idx].sg_rgb_bg = -1; HL_TABLE()[idx].sg_rgb_bg = -1;
} }
did_change = true;
}
} }
if (is_normal_group) { if (is_normal_group) {
normal_bg = HL_TABLE()[idx].sg_rgb_bg; normal_bg = HL_TABLE()[idx].sg_rgb_bg;
} }
} else if (strcmp(key, "GUISP") == 0) { } else if (strcmp(key, "GUISP") == 0) {
char_u **const namep = &HL_TABLE()[idx].sg_rgb_sp_name;
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) { if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
if (!init) { if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI; HL_TABLE()[idx].sg_set |= SG_GUI;
} }
xfree(HL_TABLE()[idx].sg_rgb_sp_name); if (*namep == NULL || STRCMP(*namep, arg) != 0) {
xfree(*namep);
if (strcmp(arg, "NONE") != 0) { if (strcmp(arg, "NONE") != 0) {
HL_TABLE()[idx].sg_rgb_sp_name = (char_u *)xstrdup((char *)arg); *namep = (char_u *)xstrdup(arg);
HL_TABLE()[idx].sg_rgb_sp = name_to_color((const char_u *)arg); HL_TABLE()[idx].sg_rgb_sp = name_to_color((char_u *)arg);
} else { } else {
HL_TABLE()[idx].sg_rgb_sp_name = NULL; *namep = NULL;
HL_TABLE()[idx].sg_rgb_sp = -1; HL_TABLE()[idx].sg_rgb_sp = -1;
} }
did_change = true;
}
} }
if (is_normal_group) { if (is_normal_group) {
@@ -6941,9 +6957,15 @@ void do_highlight(const char *line, const bool forceit, const bool init)
// Only call highlight_changed() once, after a sequence of highlight // Only call highlight_changed() once, after a sequence of highlight
// commands, and only if an attribute actually changed // 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)
&& !did_highlight_changed) { && !did_highlight_changed) {
// 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); redraw_all_later(NOT_VALID);
}
need_highlight_changed = true; need_highlight_changed = true;
} }
} }