diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2020-09-12 19:30:32 +0200 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2020-09-13 07:46:39 +0200 |
commit | 2c15f695a812c8b6ad1484912acbecb978f8727b (patch) | |
tree | efdbc77ce8d0607f3bdfbd644022985a5d525058 /src | |
parent | 4042975df42152a64f4d390ed677013d1c8609c5 (diff) | |
download | rneovim-2c15f695a812c8b6ad1484912acbecb978f8727b.tar.gz rneovim-2c15f695a812c8b6ad1484912acbecb978f8727b.tar.bz2 rneovim-2c15f695a812c8b6ad1484912acbecb978f8727b.zip |
luahl: temporary workaround for virt_text ownership ambiguity
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/extmark.c | 16 | ||||
-rw-r--r-- | src/nvim/extmark.h | 1 | ||||
-rw-r--r-- | src/nvim/screen.c | 2 |
3 files changed, 15 insertions, 4 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index c45714de78..ba94f55a50 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -844,6 +844,13 @@ VirtText *extmark_find_virttext(buf_T *buf, int row, uint64_t ns_id) bool decorations_redraw_reset(buf_T *buf, DecorationRedrawState *state) { state->row = -1; + for (size_t i = 0; i < kv_size(state->active); i++) { + HlRange item = kv_A(state->active, i); + if (item.virt_text_owned) { + clear_virttext(item.virt_text); + xfree(item.virt_text); + } + } kv_size(state->active) = 0; return buf->b_extmark_index; } @@ -889,10 +896,10 @@ bool decorations_redraw_start(buf_T *buf, int top_row, HlRange range; if (mark.id&MARKTREE_END_FLAG) { range = (HlRange){ altpos.row, altpos.col, mark.row, mark.col, - attr_id, vt }; + attr_id, vt, false }; } else { range = (HlRange){ mark.row, mark.col, altpos.row, - altpos.col, attr_id, vt }; + altpos.col, attr_id, vt, false }; } kv_push(state->active, range); @@ -957,7 +964,7 @@ int decorations_redraw_col(buf_T *buf, int col, DecorationRedrawState *state) VirtText *vt = kv_size(decor->virt_text) ? &decor->virt_text : NULL; kv_push(state->active, ((HlRange){ mark.row, mark.col, endpos.row, endpos.col, - attr_id, vt })); + attr_id, vt, false })); next_mark: marktree_itr_next(buf->b_marktree, state->itr); @@ -991,6 +998,9 @@ next_mark: } if (keep) { kv_A(state->active, j++) = kv_A(state->active, i); + } else if (item.virt_text_owned) { + clear_virttext(item.virt_text); + xfree(item.virt_text); } } kv_size(state->active) = j; diff --git a/src/nvim/extmark.h b/src/nvim/extmark.h index 534e97a7f4..d394d4d806 100644 --- a/src/nvim/extmark.h +++ b/src/nvim/extmark.h @@ -85,6 +85,7 @@ typedef struct { int end_col; int attr_id; VirtText *virt_text; + bool virt_text_owned; } HlRange; typedef struct { diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 7d020432d9..5ac5306dd9 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -645,7 +645,7 @@ void decorations_add_luahl_attr(int attr_id, { kv_push(decorations.active, ((HlRange){ start_row, start_col, - end_row, end_col, attr_id, virt_text })); + end_row, end_col, attr_id, virt_text, true })); } /* |