mirror of
https://github.com/neovim/neovim.git
synced 2026-05-02 12:04:58 +00:00
TUI: attrs -> attr_id refactor
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user