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.c67
1 files changed, 30 insertions, 37 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 9dc5774e86..f3fdafcc70 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -133,8 +133,6 @@ static sattr_T *linebuf_attr = NULL;
static match_T search_hl; /* used for 'hlsearch' highlight matching */
-static foldinfo_T win_foldinfo; /* info for 'foldcolumn' */
-
StlClickDefinition *tab_page_click_defs = NULL;
long tab_page_click_defs_size = 0;
@@ -702,7 +700,6 @@ static void win_update(win_T *wp)
long j;
static int recursive = FALSE; /* being called recursively */
int old_botline = wp->w_botline;
- long folded_lines; // rename to folded_lines instead
// Remember what happened to the previous line.
#define DID_NONE 1 // didn't update a line
#define DID_LINE 2 // updated a normal line
@@ -713,6 +710,7 @@ static void win_update(win_T *wp)
linenr_T mod_bot = 0;
int save_got_int;
+
// If we can compute a change in the automatic sizing of the sign column
// under 'signcolumn=auto:X' and signs currently placed in the buffer, better
// figuring it out here so we can redraw the entire screen for it.
@@ -1229,7 +1227,6 @@ static void win_update(win_T *wp)
// Set the time limit to 'redrawtime'.
proftime_T syntax_tm = profile_setlimit(p_rdt);
syn_set_timeout(&syntax_tm);
- win_foldinfo.fi_level = 0;
/*
* Update all the window rows.
@@ -1459,9 +1456,9 @@ static void win_update(win_T *wp)
* Otherwise, display normally (can be several display lines when
* 'wrap' is on).
*/
- folded_lines = foldedCount(wp, lnum, &win_foldinfo);
+ foldinfo_T foldinfo = fold_info(wp, lnum);
- if (folded_lines == 0
+ if (foldinfo.fi_lines == 0
&& idx < wp->w_lines_valid
&& wp->w_lines[idx].wl_valid
&& wp->w_lines[idx].wl_lnum == lnum
@@ -1482,18 +1479,17 @@ static void win_update(win_T *wp)
// Display one line
row = win_line(wp, lnum, srow,
- folded_lines ? srow : wp->w_grid.Rows,
- mod_top == 0, false,
- &win_foldinfo, folded_lines);
+ foldinfo.fi_lines ? srow : wp->w_grid.Rows,
+ mod_top == 0, false, foldinfo);
- wp->w_lines[idx].wl_folded = folded_lines != 0;
+ wp->w_lines[idx].wl_folded = foldinfo.fi_lines != 0;
wp->w_lines[idx].wl_lastlnum = lnum;
did_update = DID_LINE;
- if (folded_lines > 0) {
+ if (foldinfo.fi_lines > 0) {
did_update = DID_FOLD;
- folded_lines--;
- wp->w_lines[idx].wl_lastlnum = lnum + folded_lines;
+ foldinfo.fi_lines--;
+ wp->w_lines[idx].wl_lastlnum = lnum + foldinfo.fi_lines;
}
syntax_last_parsed = lnum;
@@ -1514,14 +1510,13 @@ static void win_update(win_T *wp)
wp->w_lines[idx].wl_size = row - srow;
}
idx++;
- lnum += folded_lines + 1;
+ lnum += foldinfo.fi_lines + 1;
} else {
if (wp->w_p_rnu) {
// 'relativenumber' set: The text doesn't need to be drawn, but
// the number column nearly always does.
- folded_lines = foldedCount(wp, lnum, &win_foldinfo);
- (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true,
- &win_foldinfo, folded_lines);
+ foldinfo_T info = fold_info(wp, lnum);
+ (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true, info);
}
// This line does not need to be drawn, advance to the next one.
@@ -1831,7 +1826,7 @@ static size_t
fill_foldcolumn(
char_u *p,
win_T *wp,
- int closed,
+ foldinfo_T foldinfo,
linenr_T lnum
)
{
@@ -1842,10 +1837,11 @@ fill_foldcolumn(
size_t char_counter = 0;
int symbol = 0;
int len = 0;
+ bool closed = foldinfo.fi_lines > 0;
// Init to all spaces.
memset(p, ' ', MAX_MCO * fdc + 1);
- level = win_foldinfo.fi_level;
+ level = foldinfo.fi_level;
// If the column is too narrow, we start at the lowest level that
// fits and use numbers to indicated the depth.
@@ -1855,8 +1851,8 @@ fill_foldcolumn(
}
for (i = 0; i < MIN(fdc, level); i++) {
- if (win_foldinfo.fi_lnum == lnum
- && first_level + i >= win_foldinfo.fi_low_level) {
+ if (foldinfo.fi_lnum == lnum
+ && first_level + i >= foldinfo.fi_low_level) {
symbol = wp->w_p_fcs_chars.foldopen;
} else if (first_level == 1) {
symbol = wp->w_p_fcs_chars.foldsep;
@@ -1896,8 +1892,7 @@ fill_foldcolumn(
/// @param endrow stop drawing once reaching this row
/// @param nochange not updating for changed text
/// @param number_only only update the number column
-/// @param[in] foldinfo fold info for this line
-/// @param folded_lines Number returned by \ref foldedCount
+/// @param foldinfo fold info for this line
///
/// @return the number of last row the line occupies.
static int
@@ -1908,8 +1903,7 @@ win_line (
int endrow,
bool nochange,
bool number_only,
- foldinfo_T *foldinfo,
- long folded_lines
+ foldinfo_T foldinfo
)
{
int c = 0; // init for GCC
@@ -2567,7 +2561,7 @@ win_line (
// already be in use.
xfree(p_extra_free);
p_extra_free = xmalloc(MAX_MCO * fdc + 1);
- n_extra = fill_foldcolumn(p_extra_free, wp, folded_lines > 0, lnum);
+ n_extra = fill_foldcolumn(p_extra_free, wp, foldinfo, lnum);
p_extra_free[n_extra] = NUL;
p_extra = p_extra_free;
c_extra = NUL;
@@ -2794,22 +2788,21 @@ win_line (
}
if (draw_state == WL_LINE
- && foldinfo->fi_level != 0
- && folded_lines > 0
+ && foldinfo.fi_level != 0
+ && foldinfo.fi_lines > 0
&& vcol == 0
&& n_extra == 0
&& row == startrow) {
char_attr = win_hl_attr(wp, HLF_FL);
- linenr_T lnume = lnum + folded_lines - 1;
+ linenr_T lnume = lnum + foldinfo.fi_lines - 1;
memset(buf_fold, ' ', FOLD_TEXT_LEN);
p_extra = get_foldtext(wp, lnum, lnume, foldinfo, buf_fold);
n_extra = STRLEN(p_extra);
if (p_extra != buf_fold) {
xfree(p_extra_free);
- p_extra_free = vim_strsave(p_extra);
- p_extra = p_extra_free;
+ p_extra_free = p_extra;
}
c_extra = NUL;
c_final = NUL;
@@ -2817,8 +2810,8 @@ win_line (
}
if (draw_state == WL_LINE
- && foldinfo->fi_level != 0
- && folded_lines > 0
+ && foldinfo.fi_level != 0
+ && foldinfo.fi_lines > 0
&& col < grid->Columns
&& n_extra == 0
&& row == startrow) {
@@ -2826,7 +2819,7 @@ win_line (
c_extra = wp->w_p_fcs_chars.fold;
c_final = NUL;
- n_extra = grid->Columns - col;
+ n_extra = wp->w_p_rl ? (col + 1) : (grid->Columns - col);
}
if (draw_state == WL_LINE && (area_highlighting || has_spell)) {
@@ -3057,7 +3050,7 @@ win_line (
p_extra++;
}
n_extra--;
- } else if (folded_lines > 0) {
+ } else if (foldinfo.fi_lines > 0) {
// skip writing the buffer line itself
c = NUL;
XFREE_CLEAR(p_extra_free);
@@ -3939,7 +3932,7 @@ win_line (
if (wp == curwin && lnum == curwin->w_cursor.lnum) {
curwin->w_cline_row = startrow;
curwin->w_cline_height = row - startrow;
- curwin->w_cline_folded = folded_lines > 0;
+ curwin->w_cline_folded = foldinfo.fi_lines > 0;
curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW);
conceal_cursor_used = conceal_cursor_line(curwin);
}
@@ -4131,7 +4124,7 @@ win_line (
* so far. If there is no more to display it is caught above.
*/
if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns))
- && folded_lines == 0
+ && foldinfo.fi_lines == 0
&& (*ptr != NUL
|| filler_todo > 0
|| (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL