aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-04-24 09:28:04 +0200
committerbfredl <bjorn.linse@gmail.com>2022-05-07 14:08:21 +0200
commit5e2346178c8c5a5dd895b4b0b85c8783f048625c (patch)
tree62965461caab6a5e74e3287ca8111d1d60770e54
parentd30621064105d1f5e4e695fb09607269694f02d0 (diff)
downloadrneovim-5e2346178c8c5a5dd895b4b0b85c8783f048625c.tar.gz
rneovim-5e2346178c8c5a5dd895b4b0b85c8783f048625c.tar.bz2
rneovim-5e2346178c8c5a5dd895b4b0b85c8783f048625c.zip
refactor(decor): use decor levels properly
-rw-r--r--src/nvim/api/extmark.c12
-rw-r--r--src/nvim/decoration.c37
-rw-r--r--src/nvim/screen.c10
3 files changed, 26 insertions, 33 deletions
diff --git a/src/nvim/api/extmark.c b/src/nvim/api/extmark.c
index bbc1ee9d71..1f47ac4ebb 100644
--- a/src/nvim/api/extmark.c
+++ b/src/nvim/api/extmark.c
@@ -488,6 +488,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
FUNC_API_SINCE(7)
{
Decoration decor = DECORATION_INIT;
+ bool has_decor = false;
buf_T *buf = find_buffer_by_handle(buffer, err);
if (!buf) {
@@ -577,6 +578,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (ERROR_SET(err)) {
goto error;
}
+ has_decor = true;
}
}
@@ -586,6 +588,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (c.size) {
decor.conceal_char = utf_ptr2char((const char_u *)c.data);
}
+ has_decor = true;
} else if (HAS_KEY(opts->conceal)) {
api_set_error(err, kErrorTypeValidation, "conceal is not a String");
goto error;
@@ -594,6 +597,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (opts->virt_text.type == kObjectTypeArray) {
decor.virt_text = parse_virt_text(opts->virt_text.data.array, err,
&decor.virt_text_width);
+ has_decor = true;
if (ERROR_SET(err)) {
goto error;
}
@@ -665,6 +669,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (ERROR_SET(err)) {
goto error;
}
+ has_decor = true;
}
} else if (HAS_KEY(opts->virt_lines)) {
api_set_error(err, kErrorTypeValidation, "virt_lines is not an Array");
@@ -693,6 +698,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
api_set_error(err, kErrorTypeValidation, "sign_text is not a valid value");
goto error;
}
+ has_decor = true;
} else if (HAS_KEY(opts->sign_text)) {
api_set_error(err, kErrorTypeValidation, "sign_text is not a String");
goto error;
@@ -718,6 +724,9 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
OPTION_TO_BOOL(ephemeral, ephemeral, false);
OPTION_TO_BOOL(decor.ui_watched, ui_watched, false);
+ if (decor.ui_watched) {
+ has_decor = true;
+ }
if (line < 0) {
api_set_error(err, kErrorTypeValidation, "line value outside range");
@@ -780,7 +789,8 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
}
extmark_set(buf, (uint32_t)ns_id, &id, (int)line, (colnr_T)col, line2, col2,
- &decor, right_gravity, end_right_gravity, kExtmarkNoUndo);
+ has_decor ? &decor : NULL, right_gravity, end_right_gravity,
+ kExtmarkNoUndo);
}
return (Integer)id;
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index c48cf6e832..28257dd7b5 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -74,8 +74,7 @@ void decor_redraw(buf_T *buf, int row1, int row2, Decoration *decor)
}
}
- if (decor && (kv_size(decor->virt_text)
- || decor->ui_watched)) {
+ if (decor && decor_virt_pos(*decor)) {
redraw_buf_line_later(buf, row1 + 1);
}
@@ -175,6 +174,12 @@ Decoration get_decor(mtkey_t mark)
}
}
+/// @return true if decor has a virtual position (virtual text or ui_watched)
+static bool decor_virt_pos(Decoration decor)
+{
+ return kv_size(decor.virt_text) || decor.ui_watched;
+}
+
bool decor_redraw_start(buf_T *buf, int top_row, DecorState *state)
{
@@ -196,22 +201,11 @@ bool decor_redraw_start(buf_T *buf, int top_row, DecorState *state)
Decoration decor = get_decor(mark);
- // Exclude non-paired marks unless they contain virt_text or a sign
- // or they are ui-watched
- if (!mt_paired(mark)
- && !kv_size(decor.virt_text)
- && !decor_has_sign(&decor)
- && !decor.ui_watched) {
- goto next_mark;
- }
-
mtpos_t altpos = marktree_get_altpos(buf->b_marktree, mark, NULL);
// Exclude start marks if the end mark position is above the top row
// Exclude end marks if we have already added the start mark
- if ((mt_start(mark) && altpos.row < top_row
- && !kv_size(decor.virt_text)
- && !decor.ui_watched)
+ if ((mt_start(mark) && altpos.row < top_row && !decor_virt_pos(decor))
|| (mt_end(mark) && altpos.row >= top_row)) {
goto next_mark;
}
@@ -301,13 +295,6 @@ int decor_redraw_col(buf_T *buf, int col, int win_col, bool hidden, DecorState *
endpos = mark.pos;
}
- if (endpos.row < mark.pos.row
- || (endpos.row == mark.pos.row && endpos.col <= mark.pos.col)) {
- if (!kv_size(decor.virt_text) && !decor.ui_watched) {
- goto next_mark;
- }
- }
-
decor_add(state, mark.pos.row, mark.pos.col, endpos.row, endpos.col,
&decor, false, mark.ns, mark.id);
@@ -326,8 +313,7 @@ next_mark:
bool active = false, keep = true;
if (item.end_row < state->row
|| (item.end_row == state->row && item.end_col <= col)) {
- if (!(item.start_row >= state->row
- && (kv_size(item.decor.virt_text) || item.decor.ui_watched))) {
+ if (!(item.start_row >= state->row && decor_virt_pos(item.decor))) {
keep = false;
}
} else {
@@ -355,7 +341,7 @@ next_mark:
}
}
if ((item.start_row == state->row && item.start_col <= col)
- && (kv_size(item.decor.virt_text) || item.decor.ui_watched)
+ && decor_virt_pos(item.decor)
&& item.decor.virt_text_pos == kVTOverlay && item.win_col == -1) {
item.win_col = (item.decor.virt_text_hide && hidden) ? -2 : win_col;
}
@@ -523,8 +509,7 @@ bool decor_redraw_eol(buf_T *buf, DecorState *state, int *eol_attr, int eol_col)
bool has_virttext = false;
for (size_t i = 0; i < kv_size(state->active); i++) {
DecorRange item = kv_A(state->active, i);
- if (item.start_row == state->row
- && (kv_size(item.decor.virt_text) || item.decor.ui_watched)) {
+ if (item.start_row == state->row && decor_virt_pos(item.decor)) {
has_virttext = true;
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 384f2995ee..7f5e476501 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -1704,12 +1704,10 @@ static void win_update(win_T *wp, DecorProviders *providers)
wp->w_old_botfill = wp->w_botfill;
// Send win_extmarks if needed
- if (kv_size(win_extmark_arr) > 0) {
- for (size_t n = 0; n < kv_size(win_extmark_arr); n++) {
- ui_call_win_extmark(wp->w_grid_alloc.handle, wp->handle,
- kv_A(win_extmark_arr, n).ns_id, kv_A(win_extmark_arr, n).mark_id,
- kv_A(win_extmark_arr, n).win_row, kv_A(win_extmark_arr, n).win_col);
- }
+ for (size_t n = 0; n < kv_size(win_extmark_arr); n++) {
+ ui_call_win_extmark(wp->w_grid_alloc.handle, wp->handle,
+ kv_A(win_extmark_arr, n).ns_id, kv_A(win_extmark_arr, n).mark_id,
+ kv_A(win_extmark_arr, n).win_row, kv_A(win_extmark_arr, n).win_col);
}
if (dollar_vcol == -1) {