aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/extmark.c19
-rw-r--r--src/nvim/marktree.c4
2 files changed, 11 insertions, 12 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c
index 8726abc59d..c4d8f75a21 100644
--- a/src/nvim/extmark.c
+++ b/src/nvim/extmark.c
@@ -68,6 +68,14 @@ uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t *idp, int row, colnr_T
uint64_t mark = 0;
uint64_t id = idp ? *idp : 0;
+ uint8_t decor_level = kDecorLevelNone; // no decor
+ if (decor) {
+ decor_level = kDecorLevelVisible; // decor affects redraw
+ if (kv_size(decor->virt_lines)) {
+ decor_level = kDecorLevelVirtLine; // decor affects horizontal size
+ }
+ }
+
if (id == 0) {
id = ns->free_id++;
} else {
@@ -76,7 +84,6 @@ uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t *idp, int row, colnr_T
if (old_mark & MARKTREE_PAIRED_FLAG || end_row > -1) {
extmark_del(buf, ns_id, id);
} else {
- // TODO(bfredl): we need to do more if "revising" a decoration mark.
MarkTreeIter itr[1] = { 0 };
old_pos = marktree_lookup(buf->b_marktree, old_mark, itr);
assert(itr->node);
@@ -86,7 +93,7 @@ uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t *idp, int row, colnr_T
if (it.decor) {
decor_remove(buf, row, row, it.decor);
}
- mark = marktree_revise(buf->b_marktree, itr);
+ mark = marktree_revise(buf->b_marktree, itr, decor_level);
goto revised;
}
marktree_del_itr(buf->b_marktree, itr, false);
@@ -96,14 +103,6 @@ uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t *idp, int row, colnr_T
}
}
- uint8_t decor_level = kDecorLevelNone; // no decor
- if (decor) {
- decor_level = kDecorLevelVisible; // decor affects redraw
- if (kv_size(decor->virt_lines)) {
- decor_level = kDecorLevelVirtLine; // decor affects horizontal size
- }
- }
-
if (end_row > -1) {
mark = marktree_put_pair(buf->b_marktree,
row, col, right_gravity,
diff --git a/src/nvim/marktree.c b/src/nvim/marktree.c
index a7f540c748..38014ab375 100644
--- a/src/nvim/marktree.c
+++ b/src/nvim/marktree.c
@@ -570,11 +570,11 @@ void marktree_free_node(mtnode_t *x)
}
/// NB: caller must check not pair!
-uint64_t marktree_revise(MarkTree *b, MarkTreeIter *itr)
+uint64_t marktree_revise(MarkTree *b, MarkTreeIter *itr, uint8_t decor_level)
{
uint64_t old_id = rawkey(itr).id;
pmap_del(uint64_t)(b->id2node, ANTIGRAVITY(old_id));
- uint64_t new_id = (b->next_id += ID_INCR);
+ uint64_t new_id = (b->next_id += ID_INCR) + ((uint64_t)decor_level << DECOR_OFFSET);
rawkey(itr).id = new_id + (RIGHT_GRAVITY&old_id);
refkey(b, itr->node, itr->i);
return new_id;