diff options
Diffstat (limited to 'src/nvim/drawline.c')
-rw-r--r-- | src/nvim/drawline.c | 84 |
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; |