summaryrefslogtreecommitdiffstats
path: root/src/screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c160
1 files changed, 71 insertions, 89 deletions
diff --git a/src/screen.c b/src/screen.c
index c01a74c44e..d5e8e295ce 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -123,7 +123,7 @@ static schar_T *current_ScreenLine;
static void win_update(win_T *wp);
static void win_redr_status(win_T *wp, int ignore_pum);
-static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T hl);
+static void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl);
#ifdef FEAT_FOLDING
static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T lnum, int row);
static void fill_foldcolumn(char_u *p, win_T *wp, int closed, linenr_T lnum);
@@ -2217,7 +2217,7 @@ win_update(win_T *wp)
}
else
{
- win_draw_end(wp, '@', ' ', srow, wp->w_height, HLF_AT);
+ win_draw_end(wp, '@', ' ', TRUE, srow, wp->w_height, HLF_AT);
wp->w_botline = lnum;
}
}
@@ -2231,16 +2231,14 @@ win_update(win_T *wp)
j = diff_check_fill(wp, wp->w_botline);
if (j > 0 && !wp->w_botfill)
{
- /*
- * Display filler lines at the end of the file
- */
+ // Display filler lines at the end of the file.
if (char2cells(fill_diff) > 1)
i = '-';
else
i = fill_diff;
if (row + j > wp->w_height)
j = wp->w_height - row;
- win_draw_end(wp, i, i, row, row + (int)j, HLF_DED);
+ win_draw_end(wp, i, i, TRUE, row, row + (int)j, HLF_DED);
row += j;
}
#endif
@@ -2248,9 +2246,9 @@ win_update(win_T *wp)
else if (dollar_vcol == -1)
wp->w_botline = lnum;
- /* make sure the rest of the screen is blank */
- /* put '~'s on rows that aren't part of the file. */
- win_draw_end(wp, '~', ' ', row, wp->w_height, HLF_EOB);
+ // Make sure the rest of the screen is blank
+ // put '~'s on rows that aren't part of the file.
+ win_draw_end(wp, '~', ' ', FALSE, row, wp->w_height, HLF_EOB);
}
#ifdef SYN_TIME_LIMIT
@@ -2305,113 +2303,97 @@ win_update(win_T *wp)
}
/*
- * Clear the rest of the window and mark the unused lines with "c1". use "c2"
- * as the filler character.
+ * Call screen_fill() with the columns adjusted for 'rightleft' if needed.
+ * Return the new offset.
+ */
+ static int
+screen_fill_end(
+ win_T *wp,
+ int c1,
+ int c2,
+ int off,
+ int width,
+ int row,
+ int endrow,
+ int attr)
+{
+ int nn = off + width;
+
+ if (nn > wp->w_width)
+ nn = wp->w_width;
+#ifdef FEAT_RIGHTLEFT
+ if (wp->w_p_rl)
+ {
+ screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
+ W_ENDCOL(wp) - nn, (int)W_ENDCOL(wp) - off,
+ c1, c2, attr);
+ }
+ else
+#endif
+ screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
+ wp->w_wincol + off, (int)wp->w_wincol + nn,
+ c1, c2, attr);
+ return nn;
+}
+
+/*
+ * Clear lines near the end the window and mark the unused lines with "c1".
+ * use "c2" as the filler character.
+ * When "draw_margin" is TRUE then draw the sign, fold and number columns.
*/
static void
win_draw_end(
win_T *wp,
int c1,
int c2,
+ int draw_margin,
int row,
int endrow,
hlf_T hl)
{
-#if defined(FEAT_FOLDING) || defined(FEAT_SIGNS) || defined(FEAT_CMDWIN)
int n = 0;
-# define FDC_OFF n
-#else
-# define FDC_OFF 0
-#endif
+
+ if (draw_margin)
+ {
#ifdef FEAT_FOLDING
- int fdc = compute_foldcolumn(wp, 0);
+ int fdc = compute_foldcolumn(wp, 0);
+
+ if (fdc > 0)
+ // draw the fold column
+ n = screen_fill_end(wp, ' ', ' ', n, fdc,
+ row, endrow, HL_ATTR(HLF_FC));
#endif
+#ifdef FEAT_SIGNS
+ if (signcolumn_on(wp))
+ // draw the sign column
+ n = screen_fill_end(wp, ' ', ' ', n, 2,
+ row, endrow, HL_ATTR(HLF_SC));
+#endif
+ if ((wp->w_p_nu || wp->w_p_rnu)
+ && vim_strchr(p_cpo, CPO_NUMCOL) == NULL)
+ // draw the number column
+ n = screen_fill_end(wp, ' ', ' ', n, number_width(wp) + 1,
+ row, endrow, HL_ATTR(HLF_N));
+ }
#ifdef FEAT_RIGHTLEFT
if (wp->w_p_rl)
{
- /* No check for cmdline window: should never be right-left. */
-# ifdef FEAT_FOLDING
- n = fdc;
-
- if (n > 0)
- {
- /* draw the fold column at the right */
- if (n > wp->w_width)
- n = wp->w_width;
- screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- W_ENDCOL(wp) - n, (int)W_ENDCOL(wp),
- ' ', ' ', HL_ATTR(HLF_FC));
- }
-# endif
-# ifdef FEAT_SIGNS
- if (signcolumn_on(wp))
- {
- int nn = n + 2;
-
- /* draw the sign column left of the fold column */
- if (nn > wp->w_width)
- nn = wp->w_width;
- screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- W_ENDCOL(wp) - nn, (int)W_ENDCOL(wp) - n,
- ' ', ' ', HL_ATTR(HLF_SC));
- n = nn;
- }
-# endif
screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- wp->w_wincol, W_ENDCOL(wp) - 1 - FDC_OFF,
+ wp->w_wincol, W_ENDCOL(wp) - 1 - n,
c2, c2, HL_ATTR(hl));
screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- W_ENDCOL(wp) - 1 - FDC_OFF, W_ENDCOL(wp) - FDC_OFF,
+ W_ENDCOL(wp) - 1 - n, W_ENDCOL(wp) - n,
c1, c2, HL_ATTR(hl));
}
else
#endif
{
-#ifdef FEAT_CMDWIN
- if (cmdwin_type != 0 && wp == curwin)
- {
- /* draw the cmdline character in the leftmost column */
- n = 1;
- if (n > wp->w_width)
- n = wp->w_width;
- screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- wp->w_wincol, (int)wp->w_wincol + n,
- cmdwin_type, ' ', HL_ATTR(HLF_AT));
- }
-#endif
-#ifdef FEAT_FOLDING
- if (fdc > 0)
- {
- int nn = n + fdc;
-
- /* draw the fold column at the left */
- if (nn > wp->w_width)
- nn = wp->w_width;
- screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- wp->w_wincol + n, (int)wp->w_wincol + nn,
- ' ', ' ', HL_ATTR(HLF_FC));
- n = nn;
- }
-#endif
-#ifdef FEAT_SIGNS
- if (signcolumn_on(wp))
- {
- int nn = n + 2;
-
- /* draw the sign column after the fold column */
- if (nn > wp->w_width)
- nn = wp->w_width;
- screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- wp->w_wincol + n, (int)wp->w_wincol + nn,
- ' ', ' ', HL_ATTR(HLF_SC));
- n = nn;
- }
-#endif
screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow,
- wp->w_wincol + FDC_OFF, (int)W_ENDCOL(wp),
+ wp->w_wincol + n, (int)W_ENDCOL(wp),
c1, c2, HL_ATTR(hl));
}
+
set_empty_rows(wp, row);
}
@@ -5885,7 +5867,7 @@ win_line(
#endif
)
{
- win_draw_end(wp, '@', ' ', row, wp->w_height, HLF_AT);
+ win_draw_end(wp, '@', ' ', TRUE, row, wp->w_height, HLF_AT);
draw_vsep_win(wp, row);
row = endrow;
}