aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/screen.c')
-rw-r--r--src/nvim/screen.c94
1 files changed, 48 insertions, 46 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 63f3267d8a..d14e0c83a6 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -65,6 +65,7 @@
#include <stdbool.h>
#include <string.h>
+#include "nvim/api/extmark.h"
#include "nvim/api/private/helpers.h"
#include "nvim/api/vim.h"
#include "nvim/arabic.h"
@@ -166,7 +167,7 @@ static bool resizing = false;
#endif
#define SEARCH_HL_PRIORITY 0
-static char * provider_err = NULL;
+static char *provider_err = NULL;
static bool provider_invoke(NS ns_id, const char *name, LuaRef ref, Array args, bool default_true)
{
@@ -694,7 +695,7 @@ void conceal_check_cursor_line(void)
if (curwin->w_p_cole > 0 && (conceal_cursor_used != should_conceal)) {
redrawWinline(curwin, curwin->w_cursor.lnum);
// Need to recompute cursor column, e.g., when starting Visual mode
- // without concealing. */
+ // without concealing.
curs_columns(curwin, true);
}
}
@@ -1951,7 +1952,7 @@ static size_t fill_foldcolumn(char_u *p, win_T *wp, foldinfo_T foldinfo, linenr_
first_level = 1;
}
- for (i = 0; i < MIN(fdc, level); i++) {
+ for (i = 0; i < MIN(fdc, level); i++) {
if (foldinfo.fi_lnum == lnum
&& first_level + i >= foldinfo.fi_low_level) {
symbol = wp->w_p_fcs_chars.foldopen;
@@ -2372,11 +2373,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
filler_lines = 0;
area_highlighting = true;
}
- int virtual_lines = decor_virtual_lines(wp, lnum);
- filler_lines += virtual_lines;
+ VirtLines virt_lines = KV_INITIAL_VALUE;
+ int n_virt_lines = decor_virt_lines(wp, lnum, &virt_lines);
+ filler_lines += n_virt_lines;
if (lnum == wp->w_topline) {
filler_lines = wp->w_topfill;
- virtual_lines = MIN(virtual_lines, filler_lines);
+ n_virt_lines = MIN(n_virt_lines, filler_lines);
}
filler_todo = filler_lines;
@@ -2418,7 +2420,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
// If this line has a sign with line highlighting set line_attr.
// TODO(bfredl, vigoux): this should not take priority over decoration!
- sign_attrs_T * sattr = sign_get_attr(SIGN_LINEHL, sattrs, 0, 1);
+ sign_attrs_T *sattr = sign_get_attr(SIGN_LINEHL, sattrs, 0, 1);
if (sattr != NULL) {
line_attr = sattr->sat_linehl;
}
@@ -2904,7 +2906,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
if (draw_state == WL_SBR - 1 && n_extra == 0) {
draw_state = WL_SBR;
- if (filler_todo > filler_lines - virtual_lines) {
+ if (filler_todo > filler_lines - n_virt_lines) {
// TODO(bfredl): check this doesn't inhibit TUI-style
// clear-to-end-of-line.
c_extra = ' ';
@@ -4423,12 +4425,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
int draw_col = col - boguscols;
if (filler_todo > 0) {
- int index = filler_todo - (filler_lines - virtual_lines);
+ int index = filler_todo - (filler_lines - n_virt_lines);
if (index > 0) {
- int fpos = kv_size(buf->b_virt_lines) - index;
- assert(fpos >= 0);
- int offset = buf->b_virt_line_leftcol ? 0 : win_col_offset;
- draw_virt_text_item(buf, offset, kv_A(buf->b_virt_lines, fpos),
+ int i = kv_size(virt_lines) - index;
+ assert(i >= 0);
+ int offset = kv_A(virt_lines, i).left_col ? 0 : win_col_offset;
+ draw_virt_text_item(buf, offset, kv_A(virt_lines, i).line,
kHlModeReplace, grid->Columns, offset);
}
} else {
@@ -4506,6 +4508,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
cap_col = 0;
}
+ kv_destroy(virt_lines);
xfree(p_extra_free);
return row;
}
@@ -4827,8 +4830,8 @@ static void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol,
}
if (clear_next) {
- /* Clear the second half of a double-wide character of which the left
- * half was overwritten with a single-wide character. */
+ // Clear the second half of a double-wide character of which the left
+ // half was overwritten with a single-wide character.
schar_from_ascii(grid->chars[off_to], ' ');
end_dirty++;
}
@@ -5175,9 +5178,9 @@ void win_redr_status_matches(expand_T *xp, int num_matches, char_u **matches, in
}
wild_menu_showing = WM_SCROLLED;
} else {
- /* Create status line if needed by setting 'laststatus' to 2.
- * Set 'winminheight' to zero to avoid that the window is
- * resized. */
+ // Create status line if needed by setting 'laststatus' to 2.
+ // Set 'winminheight' to zero to avoid that the window is
+ // resized.
if (lastwin->w_status_height == 0) {
save_p_ls = p_ls;
save_p_wmh = p_wmh;
@@ -6078,7 +6081,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
|| (cur != NULL && pos_inprogress))) {
next_search_hl(wp, shl, shl->first_lnum, (colnr_T)n,
shl == &search_hl ? NULL : cur);
- pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
+ pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
if (shl->lnum != 0) {
shl->first_lnum = shl->lnum
+ shl->rm.endpos[0].lnum
@@ -6722,7 +6725,6 @@ bool grid_invalid_row(ScreenGrid *grid, int row)
}
-
/// Copy part of a grid line for vertically split window.
static void linecopy(ScreenGrid *grid, int to, int from, int col, int width)
{
@@ -6959,7 +6961,7 @@ int showmode(void)
lines_left = 0;
if (do_mode) {
- MSG_PUTS_ATTR("--", attr);
+ msg_puts_attr("--", attr);
// CTRL-X in Insert mode
if (edit_submode != NULL && !shortmess(SHM_COMPLETIONMENU)) {
// These messages can get long, avoid a wrap in a narrow window.
@@ -6984,7 +6986,7 @@ int showmode(void)
msg_puts_attr((const char *)edit_submode, attr);
}
if (edit_submode_extra != NULL) {
- MSG_PUTS_ATTR(" ", attr); // Add a space in between.
+ msg_puts_attr(" ", attr); // Add a space in between.
if ((int)edit_submode_highl < HLF_COUNT) {
sub_attr = win_hl_attr(curwin, edit_submode_highl);
} else {
@@ -6995,37 +6997,37 @@ int showmode(void)
}
} else {
if (State & TERM_FOCUS) {
- MSG_PUTS_ATTR(_(" TERMINAL"), attr);
+ msg_puts_attr(_(" TERMINAL"), attr);
} else if (State & VREPLACE_FLAG) {
- MSG_PUTS_ATTR(_(" VREPLACE"), attr);
+ msg_puts_attr(_(" VREPLACE"), attr);
} else if (State & REPLACE_FLAG) {
- MSG_PUTS_ATTR(_(" REPLACE"), attr);
+ msg_puts_attr(_(" REPLACE"), attr);
} else if (State & INSERT) {
if (p_ri) {
- MSG_PUTS_ATTR(_(" REVERSE"), attr);
+ msg_puts_attr(_(" REVERSE"), attr);
}
- MSG_PUTS_ATTR(_(" INSERT"), attr);
+ msg_puts_attr(_(" INSERT"), attr);
} else if (restart_edit == 'I' || restart_edit == 'i'
|| restart_edit == 'a') {
- MSG_PUTS_ATTR(_(" (insert)"), attr);
+ msg_puts_attr(_(" (insert)"), attr);
} else if (restart_edit == 'R') {
- MSG_PUTS_ATTR(_(" (replace)"), attr);
+ msg_puts_attr(_(" (replace)"), attr);
} else if (restart_edit == 'V') {
- MSG_PUTS_ATTR(_(" (vreplace)"), attr);
+ msg_puts_attr(_(" (vreplace)"), attr);
}
if (p_hkmap) {
- MSG_PUTS_ATTR(_(" Hebrew"), attr);
+ msg_puts_attr(_(" Hebrew"), attr);
}
if (State & LANGMAP) {
if (curwin->w_p_arab) {
- MSG_PUTS_ATTR(_(" Arabic"), attr);
+ msg_puts_attr(_(" Arabic"), attr);
} else if (get_keymap_str(curwin, (char_u *)" (%s)",
NameBuff, MAXPATHL)) {
- MSG_PUTS_ATTR(NameBuff, attr);
+ msg_puts_attr((char *)NameBuff, attr);
}
}
if ((State & INSERT) && p_paste) {
- MSG_PUTS_ATTR(_(" (paste)"), attr);
+ msg_puts_attr(_(" (paste)"), attr);
}
if (VIsual_active) {
@@ -7049,9 +7051,9 @@ int showmode(void)
default:
p = N_(" SELECT BLOCK"); break;
}
- MSG_PUTS_ATTR(_(p), attr);
+ msg_puts_attr(_(p), attr);
}
- MSG_PUTS_ATTR(" --", attr);
+ msg_puts_attr(" --", attr);
}
need_clear = TRUE;
@@ -7140,11 +7142,11 @@ void clearmode(void)
static void recording_mode(int attr)
{
- MSG_PUTS_ATTR(_("recording"), attr);
+ msg_puts_attr(_("recording"), attr);
if (!shortmess(SHM_RECORDING)) {
- char_u s[4];
- snprintf((char *)s, ARRAY_SIZE(s), " @%c", reg_recording);
- MSG_PUTS_ATTR(s, attr);
+ char s[4];
+ snprintf(s, ARRAY_SIZE(s), " @%c", reg_recording);
+ msg_puts_attr(s, attr);
}
}
@@ -7324,8 +7326,8 @@ void draw_tabline(void)
}
}
- /* Reset the flag here again, in case evaluating 'tabline' causes it to be
- * set. */
+ // Reset the flag here again, in case evaluating 'tabline' causes it to be
+ // set.
redraw_tabline = false;
}
@@ -7379,7 +7381,7 @@ void get_trans_bufname(buf_T *buf)
/*
* Get the character to use in a status line. Get its attributes in "*attr".
*/
-static int fillchar_status(int *attr, win_T *wp)
+int fillchar_status(int *attr, win_T *wp)
{
int fill;
bool is_curwin = (wp == curwin);
@@ -7390,9 +7392,9 @@ static int fillchar_status(int *attr, win_T *wp)
*attr = win_hl_attr(wp, HLF_SNC);
fill = wp->w_p_fcs_chars.stlnc;
}
- /* Use fill when there is highlighting, and highlighting of current
- * window differs, or the fillchars differ, or this is not the
- * current window */
+ // Use fill when there is highlighting, and highlighting of current
+ // window differs, or the fillchars differ, or this is not the
+ // current window
if (*attr != 0 && ((win_hl_attr(wp, HLF_S) != win_hl_attr(wp, HLF_SNC)
|| !is_curwin || ONE_WINDOW)
|| (wp->w_p_fcs_chars.stl != wp->w_p_fcs_chars.stlnc))) {