aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/popupmenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/popupmenu.c')
-rw-r--r--src/nvim/popupmenu.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c
index ddcb819054..7df6a1a5d7 100644
--- a/src/nvim/popupmenu.c
+++ b/src/nvim/popupmenu.c
@@ -480,13 +480,19 @@ static int *pum_compute_text_attrs(char *text, hlf_T hlf, int user_hlattr)
for (int i = 0; i < ga->ga_len; i++) {
if (char_pos == ((uint32_t *)ga->ga_data)[i]) {
new_attr = win_hl_attr(curwin, hlf == HLF_PSI ? HLF_PMSI : HLF_PMNI);
+ new_attr = hl_combine_attr(win_hl_attr(curwin, HLF_PMNI), new_attr);
+ new_attr = hl_combine_attr(win_hl_attr(curwin, (int)hlf), new_attr);
break;
}
}
} else if (matched_start && ptr < text + leader_len) {
new_attr = win_hl_attr(curwin, hlf == HLF_PSI ? HLF_PMSI : HLF_PMNI);
+ new_attr = hl_combine_attr(win_hl_attr(curwin, HLF_PMNI), new_attr);
+ new_attr = hl_combine_attr(win_hl_attr(curwin, (int)hlf), new_attr);
}
+ new_attr = hl_combine_attr(win_hl_attr(curwin, HLF_PNI), new_attr);
+
if (user_hlattr > 0) {
new_attr = hl_combine_attr(new_attr, user_hlattr);
}
@@ -629,6 +635,7 @@ void pum_redraw(void)
const hlf_T *const hlfs = (idx == pum_selected) ? hlfsSel : hlfsNorm;
hlf_T hlf = hlfs[0]; // start with "word" highlight
int attr = win_hl_attr(curwin, (int)hlf);
+ attr = hl_combine_attr(win_hl_attr(curwin, HLF_PNI), attr);
grid_line_start(&pum_grid, row);
@@ -650,15 +657,21 @@ void pum_redraw(void)
pum_align_order(order);
int basic_width = items_width_array[order[0]]; // first item width
bool last_isabbr = order[2] == CPT_ABBR;
+ int orig_attr = -1;
+
for (int j = 0; j < 3; j++) {
int item_type = order[j];
hlf = hlfs[item_type];
attr = win_hl_attr(curwin, (int)hlf);
- if (pum_array[idx].pum_user_hlattr > 0) {
- attr = hl_combine_attr(attr, pum_array[idx].pum_user_hlattr);
+ attr = hl_combine_attr(win_hl_attr(curwin, HLF_PNI), attr);
+ orig_attr = attr;
+ int user_abbr_hlattr = pum_array[idx].pum_user_abbr_hlattr;
+ int user_kind_hlattr = pum_array[idx].pum_user_kind_hlattr;
+ if (item_type == CPT_ABBR && user_abbr_hlattr > 0) {
+ attr = hl_combine_attr(attr, user_abbr_hlattr);
}
- if (item_type == CPT_KIND && pum_array[idx].pum_user_kind_hlattr > 0) {
- attr = hl_combine_attr(attr, pum_array[idx].pum_user_kind_hlattr);
+ if (item_type == CPT_KIND && user_kind_hlattr > 0) {
+ attr = hl_combine_attr(attr, user_kind_hlattr);
}
int width = 0;
char *s = NULL;
@@ -684,8 +697,10 @@ void pum_redraw(void)
*p = saved;
}
- int user_hlattr = pum_array[idx].pum_user_hlattr;
- int *attrs = pum_compute_text_attrs(st, hlf, user_hlattr);
+ int *attrs = NULL;
+ if (item_type == CPT_ABBR) {
+ attrs = pum_compute_text_attrs(st, hlf, user_abbr_hlattr);
+ }
if (pum_rl) {
char *rt = reverse_text(st);
@@ -727,7 +742,9 @@ void pum_redraw(void)
grid_col += width;
}
- xfree(attrs);
+ if (attrs != NULL) {
+ XFREE_CLEAR(attrs);
+ }
if (*p != TAB) {
break;
@@ -769,19 +786,21 @@ void pum_redraw(void)
}
if (pum_rl) {
- grid_line_fill(col_off - basic_width - n + 1, grid_col + 1, schar_from_ascii(' '), attr);
+ grid_line_fill(col_off - basic_width - n + 1, grid_col + 1,
+ schar_from_ascii(' '), orig_attr);
grid_col = col_off - basic_width - n;
} else {
- grid_line_fill(grid_col, col_off + basic_width + n, schar_from_ascii(' '), attr);
+ grid_line_fill(grid_col, col_off + basic_width + n,
+ schar_from_ascii(' '), orig_attr);
grid_col = col_off + basic_width + n;
}
totwidth = basic_width + n;
}
if (pum_rl) {
- grid_line_fill(col_off - pum_width + 1, grid_col + 1, schar_from_ascii(' '), attr);
+ grid_line_fill(col_off - pum_width + 1, grid_col + 1, schar_from_ascii(' '), orig_attr);
} else {
- grid_line_fill(grid_col, col_off + pum_width, schar_from_ascii(' '), attr);
+ grid_line_fill(grid_col, col_off + pum_width, schar_from_ascii(' '), orig_attr);
}
if (pum_scrollbar > 0) {
@@ -1341,14 +1360,15 @@ static void pum_select_mouse_pos(void)
if (mouse_grid == pum_grid.handle) {
pum_selected = mouse_row;
return;
- } else if (mouse_grid != pum_anchor_grid) {
+ } else if (mouse_grid != pum_anchor_grid || mouse_col < pum_grid.comp_col
+ || mouse_col >= pum_grid.comp_col + pum_grid.comp_width) {
pum_selected = -1;
return;
}
- int idx = mouse_row - pum_row;
+ int idx = mouse_row - pum_grid.comp_row;
- if (idx < 0 || idx >= pum_height) {
+ if (idx < 0 || idx >= pum_grid.comp_height) {
pum_selected = -1;
} else if (*pum_array[idx].pum_text != NUL) {
pum_selected = idx;