summaryrefslogtreecommitdiffstats
path: root/src/screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c212
1 files changed, 131 insertions, 81 deletions
diff --git a/src/screen.c b/src/screen.c
index f36ac81a45..d6b9b7d55f 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -168,7 +168,7 @@ static int win_do_lines __ARGS((win_T *wp, int row, int line_count, int mayclear
static void win_rest_invalid __ARGS((win_T *wp));
static void msg_pos_mode __ARGS((void));
#if defined(FEAT_WINDOWS)
-static void draw_tabpage __ARGS((void));
+static void draw_tabline __ARGS((void));
#endif
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
static int fillchar_status __ARGS((int *attr, int is_curwin));
@@ -420,7 +420,7 @@ update_screen(type)
#ifdef FEAT_LINEBREAK
/* Force redraw when width of 'number' column changes. */
if (curwin->w_redr_type < NOT_VALID
- && curwin->w_nrwidth != number_width(curwin))
+ && curwin->w_nrwidth != (curwin->w_p_nu ? number_width(curwin) : 0))
curwin->w_redr_type = NOT_VALID;
#endif
@@ -477,7 +477,7 @@ update_screen(type)
#ifdef FEAT_WINDOWS
/* Redraw the tab pages line if needed. */
if (redraw_tabline || type >= NOT_VALID)
- draw_tabpage();
+ draw_tabline();
#endif
/*
@@ -707,7 +707,7 @@ updateWindow(wp)
#ifdef FEAT_WINDOWS
/* When the screen was cleared redraw the tab pages line. */
if (redraw_tabline)
- draw_tabpage();
+ draw_tabline();
if (wp->w_redr_status
# ifdef FEAT_CMDL_INFO
@@ -845,11 +845,11 @@ win_update(wp)
#ifdef FEAT_LINEBREAK
/* Force redraw when width of 'number' column changes. */
- i = number_width(curwin);
- if (curwin->w_nrwidth != i)
+ i = wp->w_p_nu ? number_width(wp) : 0;
+ if (wp->w_nrwidth != i)
{
type = NOT_VALID;
- curwin->w_nrwidth = i;
+ wp->w_nrwidth = i;
}
else
#endif
@@ -4965,7 +4965,7 @@ redraw_statuslines()
if (wp->w_redr_status)
win_redr_status(wp);
if (redraw_tabline)
- draw_tabpage();
+ draw_tabline();
}
#endif
@@ -5543,7 +5543,8 @@ get_keymap_str(wp, buf, len)
#if defined(FEAT_STL_OPT) || defined(PROTO)
/*
- * Redraw the status line or ruler of window wp.
+ * Redraw the status line or ruler of window "wp".
+ * When "wp" is NULL redraw the tab pages line from 'tabline'.
*/
static void
win_redr_custom(wp, draw_ruler)
@@ -5562,56 +5563,88 @@ win_redr_custom(wp, draw_ruler)
char_u buf[MAXPATHL];
char_u *p;
struct stl_hlrec hl[STL_MAX_ITEM];
+ int use_sandbox = FALSE;
/* setup environment for the task at hand */
- row = W_WINROW(wp) + wp->w_height;
- fillchar = fillchar_status(&attr, wp == curwin);
- maxwidth = W_WIDTH(wp);
- if (*wp->w_p_stl != NUL)
- p = wp->w_p_stl;
+ if (wp == NULL)
+ {
+ /* Use 'tabline'. Always at the first line of the screen. */
+ p = p_tal;
+ row = 0;
+ fillchar = t_colors < 8 ? '_' : ' ';
+ attr = hl_attr(HLF_TPF);
+ maxwidth = Columns;
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"tabline");
+# endif
+ }
else
- p = p_stl;
- if (draw_ruler)
{
- p = p_ruf;
- /* advance past any leading group spec - implicit in ru_col */
- if (*p == '%')
+ row = W_WINROW(wp) + wp->w_height;
+ fillchar = fillchar_status(&attr, wp == curwin);
+ maxwidth = W_WIDTH(wp);
+
+ if (draw_ruler)
{
- if (*++p == '-')
- p++;
- if (atoi((char *) p))
- while (VIM_ISDIGIT(*p))
+ p = p_ruf;
+ /* advance past any leading group spec - implicit in ru_col */
+ if (*p == '%')
+ {
+ if (*++p == '-')
p++;
- if (*p++ != '(')
- p = p_ruf;
- }
+ if (atoi((char *) p))
+ while (VIM_ISDIGIT(*p))
+ p++;
+ if (*p++ != '(')
+ p = p_ruf;
+ }
#ifdef FEAT_VERTSPLIT
- col = ru_col - (Columns - W_WIDTH(wp));
- if (col < (W_WIDTH(wp) + 1) / 2)
- col = (W_WIDTH(wp) + 1) / 2;
+ col = ru_col - (Columns - W_WIDTH(wp));
+ if (col < (W_WIDTH(wp) + 1) / 2)
+ col = (W_WIDTH(wp) + 1) / 2;
#else
- col = ru_col;
- if (col > (Columns + 1) / 2)
- col = (Columns + 1) / 2;
+ col = ru_col;
+ if (col > (Columns + 1) / 2)
+ col = (Columns + 1) / 2;
#endif
- maxwidth = W_WIDTH(wp) - col;
+ maxwidth = W_WIDTH(wp) - col;
#ifdef FEAT_WINDOWS
- if (!wp->w_status_height)
+ if (!wp->w_status_height)
#endif
+ {
+ row = Rows - 1;
+ --maxwidth; /* writing in last column may cause scrolling */
+ fillchar = ' ';
+ attr = 0;
+ }
+
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"rulerformat");
+# endif
+ }
+ else
{
- row = Rows - 1;
- --maxwidth; /* writing in last column may cause scrolling */
- fillchar = ' ';
- attr = 0;
+ if (*wp->w_p_stl != NUL)
+ p = wp->w_p_stl;
+ else
+ p = p_stl;
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"statusline");
+# endif
}
+
+#ifdef FEAT_VERTSPLIT
+ col += W_WINCOL(wp);
+#endif
}
+
if (maxwidth <= 0)
return;
-#ifdef FEAT_VERTSPLIT
- col += W_WINCOL(wp);
-#endif
- width = build_stl_str_hl(wp, buf, sizeof(buf), p, fillchar, maxwidth, hl);
+ width = build_stl_str_hl(wp == NULL ? curwin : wp,
+ buf, sizeof(buf),
+ p, use_sandbox,
+ fillchar, maxwidth, hl);
len = STRLEN(buf);
while (width < maxwidth && len < sizeof(buf) - 1)
@@ -6822,7 +6855,7 @@ screenalloc(clear)
new_TabPageIdxs = (char_u *)lalloc((long_u)(Columns * sizeof(char_u)), FALSE);
#endif
- FOR_ALL_WINDOWS(wp)
+ FOR_ALL_TAB_WINDOWS(tp, wp)
{
if (win_alloc_lines(wp) == FAIL)
{
@@ -8456,14 +8489,13 @@ unshowmode(force)
* Draw the tab pages line at the top of the Vim window.
*/
static void
-draw_tabpage()
+draw_tabline()
{
int tabcount = 0;
tabpage_T *tp;
int tabwidth;
int col = 0;
int scol = 0;
- int had_current = FALSE;
int attr;
win_T *wp;
win_T *cwp;
@@ -8475,12 +8507,27 @@ draw_tabpage()
int attr_nosel = hl_attr(HLF_TP);
int attr_fill = hl_attr(HLF_TPF);
char_u *p;
+ int room;
+ int use_sep_chars = (t_colors < 8
+#ifdef FEAT_GUI
+ && !gui.in_use
+#endif
+ );
redraw_tabline = FALSE;
if (tabpageline_height() < 1)
return;
+#if defined(FEAT_STL_OPT)
+ /* Use the 'tabline' option if it's set. */
+ if (*p_tal != NUL)
+ {
+ win_redr_custom(NULL, FALSE);
+ return;
+ }
+#endif
+
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
++tabcount;
@@ -8495,17 +8542,9 @@ draw_tabpage()
scol = col;
if (tp->tp_topframe == topframe)
- {
- c = '/';
- had_current = TRUE;
attr = attr_sel;
- }
- else if (!had_current)
- c = '/';
- else
- c = '\\';
- if (t_colors < 8)
- screen_putchar(c, 0, col++, attr);
+ if (use_sep_chars && col > 0)
+ screen_putchar('|', 0, col++, attr);
if (tp->tp_topframe != topframe)
attr = attr_nosel;
@@ -8531,32 +8570,49 @@ draw_tabpage()
{
if (wincount > 1)
{
- vim_snprintf((char *)NameBuff, MAXPATHL, "#%d", wincount);
+ vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount);
len = STRLEN(NameBuff);
- screen_puts_len(NameBuff, len, 0, col, attr);
+ screen_puts_len(NameBuff, len, 0, col,
+#if defined(FEAT_SYN_HL)
+ hl_combine_attr(attr, hl_attr(HLF_T))
+#else
+ attr
+#endif
+ );
col += len;
}
if (modified)
- screen_puts_len((char_u *)"+", 2, 0, col++, attr);
+ screen_puts_len((char_u *)"+", 1, 0, col++, attr);
screen_putchar(' ', 0, col++, attr);
}
- if (buf_spname(cwp->w_buffer) != NULL)
- STRCPY(NameBuff, buf_spname(cwp->w_buffer));
- else
- home_replace(cwp->w_buffer, cwp->w_buffer->b_fname, NameBuff,
- MAXPATHL, TRUE);
- trans_characters(NameBuff, MAXPATHL);
- len = STRLEN(NameBuff);
- p = NameBuff;
- if (len > scol - col + tabwidth - 1) /* TODO: multi-byte chars */
+ room = scol - col + tabwidth - 1;
+ if (room > 0)
{
- p += len - (scol - col + tabwidth - 1);
- len = scol - col + tabwidth - 1;
- }
- if (len > 0)
- {
- screen_puts_len(p, len, 0, col, attr);
+ if (buf_spname(cwp->w_buffer) != NULL)
+ STRCPY(NameBuff, buf_spname(cwp->w_buffer));
+ else
+ home_replace(cwp->w_buffer, cwp->w_buffer->b_fname, NameBuff,
+ MAXPATHL, TRUE);
+ trans_characters(NameBuff, MAXPATHL);
+ len = vim_strsize(NameBuff);
+ p = NameBuff;
+#ifdef FEAT_MBYTE
+ if (has_mbyte)
+ while (len > room)
+ {
+ len -= ptr2cells(p);
+ mb_ptr_adv(p);
+ }
+ else
+#endif
+ if (len > room)
+ {
+ p += len - room;
+ len = room;
+ }
+
+ screen_puts_len(p, STRLEN(p), 0, col, attr);
col += len;
}
screen_putchar(' ', 0, col++, attr);
@@ -8568,11 +8624,8 @@ draw_tabpage()
TabPageIdxs[scol++] = tabcount;
}
- if (t_colors < 8)
- {
- screen_putchar('\\', 0, col++, attr);
+ if (use_sep_chars)
c = '_';
- }
else
c = ' ';
screen_fill(0, 1, col, (int)Columns, c, c, attr_fill);
@@ -8902,7 +8955,7 @@ win_redr_ruler(wp, always)
#if defined(FEAT_LINEBREAK) || defined(PROTO)
/*
* Return the width of the 'number' column.
- * Zero when 'number' isn't set.
+ * Caller may need to check if 'number' is set.
* Otherwise it depends on 'numberwidth' and the line count.
*/
int
@@ -8912,9 +8965,6 @@ number_width(wp)
int n;
linenr_T lnum;
- if (!wp->w_p_nu)
- return 0;
-
lnum = wp->w_buffer->b_ml.ml_line_count;
if (lnum == wp->w_nrwidth_line_count)
return wp->w_nrwidth_width;