mirror of
https://github.com/neovim/neovim.git
synced 2025-09-16 00:08:19 +00:00
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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,18 +6831,23 @@ 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);
|
||||||
} else {
|
HL_TABLE()[idx].sg_rgb_fg = name_to_color((char_u *)arg);
|
||||||
HL_TABLE()[idx].sg_rgb_fg_name = NULL;
|
} else {
|
||||||
HL_TABLE()[idx].sg_rgb_fg = -1;
|
*namep = NULL;
|
||||||
|
HL_TABLE()[idx].sg_rgb_fg = -1;
|
||||||
|
}
|
||||||
|
did_change = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6849,18 +6855,23 @@ void do_highlight(const char *line, const bool forceit, const bool init)
|
|||||||
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) {
|
||||||
if (STRCMP(arg, "NONE") != 0) {
|
xfree(*namep);
|
||||||
HL_TABLE()[idx].sg_rgb_bg_name = (char_u *)xstrdup((char *)arg);
|
if (STRCMP(arg, "NONE") != 0) {
|
||||||
HL_TABLE()[idx].sg_rgb_bg = name_to_color((const char_u *)arg);
|
*namep = (char_u *)xstrdup(arg);
|
||||||
} else {
|
HL_TABLE()[idx].sg_rgb_bg = name_to_color((char_u *)arg);
|
||||||
HL_TABLE()[idx].sg_rgb_bg_name = NULL;
|
} else {
|
||||||
HL_TABLE()[idx].sg_rgb_bg = -1;
|
*namep = NULL;
|
||||||
|
HL_TABLE()[idx].sg_rgb_bg = -1;
|
||||||
|
}
|
||||||
|
did_change = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6868,18 +6879,23 @@ void do_highlight(const char *line, const bool forceit, const bool init)
|
|||||||
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) {
|
||||||
if (strcmp(arg, "NONE") != 0) {
|
xfree(*namep);
|
||||||
HL_TABLE()[idx].sg_rgb_sp_name = (char_u *)xstrdup((char *)arg);
|
if (strcmp(arg, "NONE") != 0) {
|
||||||
HL_TABLE()[idx].sg_rgb_sp = name_to_color((const char_u *)arg);
|
*namep = (char_u *)xstrdup(arg);
|
||||||
} else {
|
HL_TABLE()[idx].sg_rgb_sp = name_to_color((char_u *)arg);
|
||||||
HL_TABLE()[idx].sg_rgb_sp_name = NULL;
|
} else {
|
||||||
HL_TABLE()[idx].sg_rgb_sp = -1;
|
*namep = NULL;
|
||||||
|
HL_TABLE()[idx].sg_rgb_sp = -1;
|
||||||
|
}
|
||||||
|
did_change = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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) {
|
||||||
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;
|
need_highlight_changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user