aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/drawline.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/drawline.c')
-rw-r--r--src/nvim/drawline.c84
1 files changed, 41 insertions, 43 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c
index caad88c212..fcac837993 100644
--- a/src/nvim/drawline.c
+++ b/src/nvim/drawline.c
@@ -508,31 +508,12 @@ static void get_sign_display_info(bool nrcol, win_T *wp, winlinevars_T *wlv, int
if (use_cursor_line_highlight(wp, wlv->lnum) && sign_cul_attr > 0) {
wlv->char_attr = sign_cul_attr;
} else {
- wlv->char_attr = sattr->hl_attr_id;
+ wlv->char_attr = sattr->hl_id ? syn_id2attr(sattr->hl_id) : 0;
}
}
}
}
-static int get_sign_attrs(buf_T *buf, winlinevars_T *wlv, int *sign_num_attrp, int *sign_cul_attrp)
-{
- HlPriAttr line_attrs = { wlv->line_attr, 0 };
- HlPriAttr num_attrs = { *sign_num_attrp, 0 };
- HlPriAttr cul_attrs = { *sign_cul_attrp, 0 };
-
- // TODO(bfredl, vigoux): line_attr should not take priority over decoration!
- int num_signs = buf_get_signattrs(buf, wlv->lnum, wlv->sattrs, &num_attrs, &line_attrs,
- &cul_attrs);
- decor_redraw_signs(buf, wlv->lnum - 1, &num_signs, wlv->sattrs, &num_attrs, &line_attrs,
- &cul_attrs);
-
- wlv->line_attr = line_attrs.attr_id;
- *sign_num_attrp = num_attrs.attr_id;
- *sign_cul_attrp = cul_attrs.attr_id;
-
- return num_signs;
-}
-
/// Returns width of the signcolumn that should be used for the whole window
///
/// @param wp window we want signcolumn width from
@@ -726,7 +707,7 @@ static void get_statuscol_display_info(statuscol_T *stcp, winlinevars_T *wlv)
if (stcp->textp + wlv->n_extra < stcp->text_end) {
int hl = stcp->hlrecp->userhl;
stcp->textp = stcp->hlrecp->start;
- stcp->cur_attr = hl < 0 ? syn_id2attr(-hl) : hl > 0 ? hl : stcp->num_attr;
+ stcp->cur_attr = hl < 0 ? syn_id2attr(-hl) : stcp->num_attr;
stcp->hlrecp++;
wlv->draw_state = WL_STC - 1;
}
@@ -1288,9 +1269,37 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
area_highlighting = true;
}
- int sign_num_attr = 0; // sign attribute for the number column
- int sign_cul_attr = 0; // sign attribute for cursorline
- int num_signs = get_sign_attrs(buf, &wlv, &sign_num_attr, &sign_cul_attr);
+ HlPriId line_id = { 0 };
+ HlPriId sign_cul = { 0 };
+ HlPriId sign_num = { 0 };
+ // TODO(bfredl, vigoux): line_attr should not take priority over decoration!
+ int num_signs = buf_get_signattrs(buf, wlv.lnum, wlv.sattrs, &sign_num, &line_id, &sign_cul);
+ decor_redraw_signs(buf, wlv.lnum - 1, &num_signs, wlv.sattrs, &sign_num, &line_id, &sign_cul);
+
+ int sign_cul_attr = 0;
+ int sign_num_attr = 0;
+ statuscol_T statuscol = { 0 };
+ if (*wp->w_p_stc != NUL) {
+ // Draw the 'statuscolumn' if option is set.
+ statuscol.draw = true;
+ statuscol.sattrs = wlv.sattrs;
+ statuscol.foldinfo = foldinfo;
+ statuscol.width = win_col_off(wp) - (cmdwin_type != 0 && wp == curwin);
+ statuscol.use_cul = use_cursor_line_highlight(wp, lnum);
+ statuscol.sign_cul_id = statuscol.use_cul ? sign_cul.hl_id : 0;
+ statuscol.num_attr = sign_num.hl_id ? syn_id2attr(sign_num.hl_id)
+ : get_line_number_attr(wp, &wlv);
+ } else {
+ if (sign_cul.hl_id > 0) {
+ sign_cul_attr = syn_id2attr(sign_cul.hl_id);
+ }
+ if (sign_num.hl_id > 0) {
+ sign_num_attr = syn_id2attr(sign_num.hl_id);
+ }
+ }
+ if (line_id.hl_id > 0) {
+ wlv.line_attr = syn_id2attr(line_id.hl_id);
+ }
// Highlight the current line in the quickfix window.
if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) {
@@ -1495,18 +1504,6 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
extra_check = true;
}
- statuscol_T statuscol = { 0 };
- if (*wp->w_p_stc != NUL) {
- // Draw the 'statuscolumn' if option is set.
- statuscol.draw = true;
- statuscol.sattrs = wlv.sattrs;
- statuscol.foldinfo = foldinfo;
- statuscol.width = win_col_off(wp) - (cmdwin_type != 0 && wp == curwin);
- statuscol.use_cul = use_cursor_line_highlight(wp, lnum);
- statuscol.sign_cul_attr = statuscol.use_cul ? sign_cul_attr : 0;
- statuscol.num_attr = sign_num_attr ? sign_num_attr : get_line_number_attr(wp, &wlv);
- }
-
int sign_idx = 0;
int virt_line_index;
int virt_line_offset = -1;
@@ -2970,16 +2967,17 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
wlv.need_showbreak = true;
}
if (statuscol.draw) {
- if (wlv.row == startrow + wlv.filler_lines + 1
- || wlv.row == startrow + wlv.filler_lines) {
- // Re-evaluate 'statuscolumn' for the first wrapped row and non filler line
- statuscol.textp = NULL;
- } else if (statuscol.textp) {
+ if (wlv.row == startrow + wlv.filler_lines) {
+ statuscol.textp = NULL; // re-evaluate for first non-filler line
+ } else if (vim_strchr(p_cpo, CPO_NUMCOL) && wlv.row > startrow + wlv.filler_lines) {
+ statuscol.draw = false; // don't draw status column if "n" is in 'cpo'
+ } else if (wlv.row == startrow + wlv.filler_lines + 1) {
+ statuscol.textp = NULL; // re-evaluate for first wrapped line
+ } else {
// Draw the already built 'statuscolumn' on the next wrapped or filler line
statuscol.textp = statuscol.text;
statuscol.hlrecp = statuscol.hlrec;
- } // Fall back to default columns if the 'n' flag isn't in 'cpo'
- statuscol.draw = vim_strchr(p_cpo, CPO_NUMCOL) == NULL;
+ }
}
wlv.filler_todo--;
virt_line_offset = -1;