diff options
Diffstat (limited to 'src/screen.c')
-rw-r--r-- | src/screen.c | 105 |
1 files changed, 74 insertions, 31 deletions
diff --git a/src/screen.c b/src/screen.c index 33037cfa7..07cf99145 100644 --- a/src/screen.c +++ b/src/screen.c @@ -5474,9 +5474,14 @@ redraw_custum_statusline(wp) called_emsg = FALSE; win_redr_custom(wp, FALSE); if (called_emsg) + { set_string_option_direct((char_u *)"statusline", -1, (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL ? OPT_LOCAL : OPT_GLOBAL)); +# ifdef FEAT_EVAL + set_option_scriptID((char_u *)"statusline", SID_ERROR); +# endif + } called_emsg |= save_called_emsg; } #endif @@ -5586,7 +5591,8 @@ win_redr_custom(wp, draw_ruler) int fillchar; char_u buf[MAXPATHL]; char_u *p; - struct stl_hlrec hl[STL_MAX_ITEM]; + struct stl_hlrec hltab[STL_MAX_ITEM]; + struct stl_hlrec tabtab[STL_MAX_ITEM]; int use_sandbox = FALSE; /* setup environment for the task at hand */ @@ -5599,7 +5605,7 @@ win_redr_custom(wp, draw_ruler) attr = hl_attr(HLF_TPF); maxwidth = Columns; # ifdef FEAT_EVAL - use_sandbox = was_set_insecurely((char_u *)"tabline"); + use_sandbox = was_set_insecurely((char_u *)"tabline", 0); # endif } else @@ -5643,7 +5649,7 @@ win_redr_custom(wp, draw_ruler) } # ifdef FEAT_EVAL - use_sandbox = was_set_insecurely((char_u *)"rulerformat"); + use_sandbox = was_set_insecurely((char_u *)"rulerformat", 0); # endif } else @@ -5653,7 +5659,8 @@ win_redr_custom(wp, draw_ruler) else p = p_stl; # ifdef FEAT_EVAL - use_sandbox = was_set_insecurely((char_u *)"statusline"); + use_sandbox = was_set_insecurely((char_u *)"statusline", + *wp->w_p_stl == NUL ? 0 : OPT_LOCAL); # endif } @@ -5668,7 +5675,7 @@ win_redr_custom(wp, draw_ruler) width = build_stl_str_hl(wp == NULL ? curwin : wp, buf, sizeof(buf), p, use_sandbox, - fillchar, maxwidth, hl); + fillchar, maxwidth, hltab, tabtab); len = STRLEN(buf); while (width < maxwidth && len < sizeof(buf) - 1) @@ -5682,27 +5689,49 @@ win_redr_custom(wp, draw_ruler) } buf[len] = NUL; + /* + * Draw each snippet with the specified highlighting. + */ curattr = attr; p = buf; - for (n = 0; hl[n].start != NULL; n++) + for (n = 0; hltab[n].start != NULL; n++) { - len = (int)(hl[n].start - p); + len = (int)(hltab[n].start - p); screen_puts_len(p, len, row, col, curattr); col += vim_strnsize(p, len); - p = hl[n].start; + p = hltab[n].start; - if (hl[n].userhl == 0) + if (hltab[n].userhl == 0) curattr = attr; - else if (hl[n].userhl < 0) - curattr = syn_id2attr(-hl[n].userhl); + else if (hltab[n].userhl < 0) + curattr = syn_id2attr(-hltab[n].userhl); #ifdef FEAT_WINDOWS else if (wp != NULL && wp != curwin && wp->w_status_height != 0) - curattr = highlight_stlnc[hl[n].userhl - 1]; + curattr = highlight_stlnc[hltab[n].userhl - 1]; #endif else - curattr = highlight_user[hl[n].userhl - 1]; + curattr = highlight_user[hltab[n].userhl - 1]; } screen_puts(p, row, col, curattr); + + if (wp == NULL) + { + /* Fill the TabPageIdxs[] array for clicking in the tab pagesline. */ + col = 0; + len = 0; + p = buf; + fillchar = 0; + for (n = 0; tabtab[n].start != NULL; n++) + { + len += vim_strnsize(p, (int)(tabtab[n].start - p)); + while (col < len) + TabPageIdxs[col++] = fillchar; + p = tabtab[n].start; + fillchar = tabtab[n].userhl; + } + while (col < Columns) + TabPageIdxs[col++] = fillchar; + } } #endif /* FEAT_STL_OPT */ @@ -6198,7 +6227,8 @@ screen_start_highlight(attr) { char buf[20]; - sprintf(buf, IF_EB("\033|%dh", ESC_STR "|%dh"), attr); /* internal GUI code */ + /* The GUI handles this internally. */ + sprintf(buf, IF_EB("\033|%dh", ESC_STR "|%dh"), attr); OUT_STR(buf); } else @@ -6207,14 +6237,7 @@ screen_start_highlight(attr) if (attr > HL_ALL) /* special HL attr. */ { if (t_colors > 1) - { aep = syn_cterm_attr2entry(attr); - /* If the Normal FG color has BOLD attribute and the new - * HL has a FG color defined, clear BOLD. */ - if (aep != NULL && aep->ae_u.cterm.fg_color - && cterm_normal_fg_bold) - out_str(T_ME); - } else aep = syn_term_attr2entry(attr); if (aep == NULL) /* did ":syntax clear" */ @@ -6224,6 +6247,11 @@ screen_start_highlight(attr) } if ((attr & HL_BOLD) && T_MD != NULL) /* bold */ out_str(T_MD); + else if (aep != NULL && t_colors > 1 && aep->ae_u.cterm.fg_color + && cterm_normal_fg_bold) + /* If the Normal FG color has BOLD attribute and the new HL + * has a FG color defined, clear BOLD. */ + out_str(T_ME); if ((attr & HL_STANDOUT) && T_SO != NULL) /* standout */ out_str(T_SO); if ((attr & (HL_UNDERLINE | HL_UNDERCURL)) && T_US != NULL) @@ -6808,7 +6836,7 @@ screenalloc(clear) unsigned *new_LineOffset; char_u *new_LineWraps; #ifdef FEAT_WINDOWS - char_u *new_TabPageIdxs; + short *new_TabPageIdxs; tabpage_T *tp; #endif static int entered = FALSE; /* avoid recursiveness */ @@ -6885,7 +6913,7 @@ screenalloc(clear) Rows * sizeof(unsigned)), FALSE); new_LineWraps = (char_u *)lalloc((long_u)(Rows * sizeof(char_u)), FALSE); #ifdef FEAT_WINDOWS - new_TabPageIdxs = (char_u *)lalloc((long_u)(Columns * sizeof(char_u)), FALSE); + new_TabPageIdxs = (short *)lalloc((long_u)(Columns * sizeof(short)), FALSE); #endif FOR_ALL_TAB_WINDOWS(tp, wp) @@ -8553,6 +8581,11 @@ draw_tabline() return; #if defined(FEAT_STL_OPT) + + /* Init TabPageIdxs[] to zero: Clicking outside of tabs has no effect. */ + for (scol = 0; scol < Columns; ++scol) + TabPageIdxs[scol] = 0; + /* Use the 'tabline' option if it's set. */ if (*p_tal != NUL) { @@ -8563,8 +8596,13 @@ draw_tabline() called_emsg = FALSE; win_redr_custom(NULL, FALSE); if (called_emsg) + { set_string_option_direct((char_u *)"tabline", -1, (char_u *)"", OPT_FREE); +# ifdef FEAT_EVAL + set_option_scriptID((char_u *)"tabline", SID_ERROR); +# endif + } called_emsg |= save_called_emsg; } else @@ -8579,6 +8617,7 @@ draw_tabline() attr = attr_nosel; tabcount = 0; + scol = 0; for (tp = first_tabpage; tp != NULL && col < Columns; tp = tp->tp_next) { scol = col; @@ -8671,15 +8710,14 @@ draw_tabline() else c = ' '; screen_fill(0, 1, col, (int)Columns, c, c, attr_fill); - } - /* Put an "X" for closing the current tab if there are several. */ - if (first_tabpage->tp_next != NULL) - screen_putchar('X', 0, (int)Columns - 1, attr_nosel); - - /* Clicking outside of tabs has no effect. */ - while (scol < Columns) - TabPageIdxs[scol++] = 0xff; + /* Put an "X" for closing the current tab if there are several. */ + if (first_tabpage->tp_next != NULL) + { + screen_putchar('X', 0, (int)Columns - 1, attr_nosel); + TabPageIdxs[Columns - 1] = -999; + } + } } #endif @@ -8852,8 +8890,13 @@ win_redr_ruler(wp, always) called_emsg = FALSE; win_redr_custom(wp, TRUE); if (called_emsg) + { set_string_option_direct((char_u *)"rulerformat", -1, (char_u *)"", OPT_FREE); +# ifdef FEAT_EVAL + set_option_scriptID((char_u *)"rulerformat", SID_ERROR); +# endif + } called_emsg |= save_called_emsg; return; } |