aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2020-09-12 19:30:32 +0200
committerBjörn Linse <bjorn.linse@gmail.com>2020-09-13 07:46:39 +0200
commit2c15f695a812c8b6ad1484912acbecb978f8727b (patch)
treeefdbc77ce8d0607f3bdfbd644022985a5d525058 /src
parent4042975df42152a64f4d390ed677013d1c8609c5 (diff)
downloadrneovim-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.c16
-rw-r--r--src/nvim/extmark.h1
-rw-r--r--src/nvim/screen.c2
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 }));
}
/*