aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/highlight_defs.h11
-rw-r--r--src/nvim/tui/tui.c49
2 files changed, 28 insertions, 32 deletions
diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h
index 09d20c75ea..0790793c94 100644
--- a/src/nvim/highlight_defs.h
+++ b/src/nvim/highlight_defs.h
@@ -37,17 +37,6 @@ typedef struct attr_entry {
.cterm_bg_color = 0, \
}
-// sentinel value that compares unequal to any valid highlight
-#define HLATTRS_INVALID (HlAttrs) { \
- .rgb_ae_attr = -1, \
- .cterm_ae_attr = -1, \
- .rgb_fg_color = -1, \
- .rgb_bg_color = -1, \
- .rgb_sp_color = -1, \
- .cterm_fg_color = 0, \
- .cterm_bg_color = 0, \
-}
-
/// Values for index in highlight_attr[].
/// When making changes, also update hlf_names below!
typedef enum {
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 4b00fcf57c..b6986b77e9 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -104,7 +104,8 @@ typedef struct {
cursorentry_T cursor_shapes[SHAPE_IDX_COUNT];
HlAttrs clear_attrs;
kvec_t(HlAttrs) attrs;
- HlAttrs print_attrs;
+ int print_attr_id;
+ bool has_bg;
bool default_attr;
ModeShape showing_mode;
struct {
@@ -186,6 +187,7 @@ static void terminfo_start(UI *ui)
data->scroll_region_is_full_screen = true;
data->bufpos = 0;
data->default_attr = false;
+ data->has_bg = false;
data->is_invisible = true;
data->busy = false;
data->cork = false;
@@ -305,7 +307,7 @@ static void terminfo_stop(UI *ui)
static void tui_terminal_start(UI *ui)
{
TUIData *data = ui->data;
- data->print_attrs = HLATTRS_INVALID;
+ data->print_attr_id = -1;
ugrid_init(&data->grid);
terminfo_start(ui);
update_size(ui);
@@ -439,8 +441,17 @@ static void sigwinch_cb(SignalWatcher *watcher, int signum, void *data)
ui_schedule_refresh();
}
-static bool attrs_differ(HlAttrs a1, HlAttrs a2, bool rgb)
+static bool attrs_differ(UI *ui, int id1, int id2, bool rgb)
{
+ TUIData *data = ui->data;
+ if (id1 == id2) {
+ return false;
+ } else if (id1 < 0 || id2 < 0) {
+ return true;
+ }
+ HlAttrs a1 = kv_A(data->attrs, (size_t)id1);
+ HlAttrs a2 = kv_A(data->attrs, (size_t)id2);
+
if (rgb) {
return a1.rgb_fg_color != a2.rgb_fg_color
|| a1.rgb_bg_color != a2.rgb_bg_color
@@ -455,21 +466,16 @@ static bool attrs_differ(HlAttrs a1, HlAttrs a2, bool rgb)
}
}
-static bool no_bg(UI *ui, HlAttrs attrs)
-{
- return ui->rgb ? attrs.rgb_bg_color == -1
- : attrs.cterm_bg_color == 0;
-}
-
-static void update_attrs(UI *ui, HlAttrs attrs)
+static void update_attrs(UI *ui, int attr_id)
{
TUIData *data = ui->data;
- if (!attrs_differ(attrs, data->print_attrs, ui->rgb)) {
+ if (!attrs_differ(ui, attr_id, data->print_attr_id, ui->rgb)) {
+ data->print_attr_id = attr_id;
return;
}
-
- data->print_attrs = attrs;
+ data->print_attr_id = attr_id;
+ HlAttrs attrs = kv_A(data->attrs, (size_t)attr_id);
int fg = ui->rgb ? attrs.rgb_fg_color : (attrs.cterm_fg_color - 1);
if (fg == -1) {
@@ -483,6 +489,8 @@ static void update_attrs(UI *ui, HlAttrs attrs)
: (data->clear_attrs.cterm_bg_color - 1);
}
+ data->has_bg = bg != -1;
+
int attr = ui->rgb ? attrs.rgb_ae_attr : attrs.cterm_ae_attr;
bool bold = attr & HL_BOLD;
bool italic = attr & HL_ITALIC;
@@ -599,7 +607,7 @@ static void print_cell(UI *ui, UCell *ptr)
// Printing the next character finally advances the cursor.
final_column_wrap(ui);
}
- update_attrs(ui, kv_A(data->attrs, ptr->attr));
+ update_attrs(ui, ptr->attr);
out(ui, ptr->data, strlen(ptr->data));
grid->col++;
if (data->immediate_wrap_after_last_column) {
@@ -615,8 +623,8 @@ static bool cheap_to_print(UI *ui, int row, int col, int next)
UCell *cell = grid->cells[row] + col;
while (next) {
next--;
- if (attrs_differ(kv_A(data->attrs, cell->attr),
- data->print_attrs, ui->rgb)) {
+ if (attrs_differ(ui, cell->attr,
+ data->print_attr_id, ui->rgb)) {
if (data->default_attr) {
return false;
}
@@ -743,11 +751,10 @@ static void clear_region(UI *ui, int top, int bot, int left, int right,
TUIData *data = ui->data;
UGrid *grid = &data->grid;
- HlAttrs attrs = kv_A(data->attrs, (size_t)attr_id);
- update_attrs(ui, attrs);
+ update_attrs(ui, attr_id);
// non-BCE terminals can't clear with non-default background color
- bool can_clear = data->bce || no_bg(ui, attrs);
+ bool can_clear = data->bce || !data->has_bg;
// Background is set to the default color and the right edge matches the
// screen end, try to use terminal codes for clearing the requested area.
@@ -1105,7 +1112,7 @@ static void tui_default_colors_set(UI *ui, Integer rgb_fg, Integer rgb_bg,
data->clear_attrs.cterm_fg_color = (int)cterm_fg;
data->clear_attrs.cterm_bg_color = (int)cterm_bg;
- data->print_attrs = HLATTRS_INVALID;
+ data->print_attr_id = -1;
invalidate(ui, 0, data->grid.height, 0, data->grid.width);
}
@@ -1233,7 +1240,7 @@ static void tui_option_set(UI *ui, String name, Object value)
if (strequal(name.data, "termguicolors")) {
ui->rgb = value.data.boolean;
- data->print_attrs = HLATTRS_INVALID;
+ data->print_attr_id = -1;
invalidate(ui, 0, data->grid.height, 0, data->grid.width);
}
}