diff options
-rw-r--r-- | src/nvim/highlight_defs.h | 11 | ||||
-rw-r--r-- | src/nvim/tui/tui.c | 49 |
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); } } |