From 00c068502d170f9f9b59c4a68aa12e8835859f6c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 09:39:41 +0200 Subject: Adding upstream version 2:9.1.0199. Signed-off-by: Daniel Baumann --- src/highlight.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 16 deletions(-) (limited to 'src/highlight.c') diff --git a/src/highlight.c b/src/highlight.c index 318564c..9b3b072 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -59,6 +59,7 @@ typedef struct int sg_cterm_bg; // terminal bg color number + 1 int sg_cterm_ul; // terminal ul color number + 1 int sg_cterm_attr; // Screen attr for color term mode + int sg_cterm_font; // terminal alternative font (0 for normal) // for when using the GUI #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) guicolor_T sg_gui_fg; // GUI foreground color handle @@ -220,8 +221,8 @@ static char *(highlight_init_light[]) = { CENT("SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue", "SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue"), #endif - CENT("Visual term=reverse", - "Visual term=reverse guibg=LightGrey"), + CENT("Visual ctermbg=Grey ctermfg=Black", + "Visual ctermbg=Grey ctermfg=Black guibg=LightGrey guifg=Black"), #ifdef FEAT_DIFF CENT("DiffAdd term=bold ctermbg=LightBlue", "DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue"), @@ -309,8 +310,8 @@ static char *(highlight_init_dark[]) = { CENT("SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan", "SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan"), #endif - CENT("Visual term=reverse", - "Visual term=reverse guibg=DarkGrey"), + CENT("Visual ctermbg=Grey ctermfg=Black", + "Visual ctermbg=Grey ctermfg=Black guibg=#575757 guifg=LightGrey"), #ifdef FEAT_DIFF CENT("DiffAdd term=bold ctermbg=DarkBlue", "DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue"), @@ -432,19 +433,16 @@ init_highlight( for (i = 0; pp[i] != NULL; ++i) do_highlight((char_u *)pp[i], reset, TRUE); - // Reverse looks ugly, but grey may not work for 8 colors. Thus let it - // depend on the number of colors available. + // Reverse looks ugly, but grey may not work for less than 8 colors. Thus + // let it depend on the number of colors available. + if (t_colors < 8) + do_highlight((char_u *)"Visual term=reverse cterm=reverse ctermbg=NONE ctermfg=NONE", + FALSE, TRUE); // With 8 colors brown is equal to yellow, need to use black for Search fg // to avoid Statement highlighted text disappears. // Clear the attributes, needed when changing the t_Co value. - if (t_colors > 8) - do_highlight((char_u *)(*p_bg == 'l' - ? "Visual cterm=NONE ctermbg=LightGrey" - : "Visual cterm=NONE ctermbg=DarkGrey"), FALSE, TRUE); - else + if (t_colors <= 8) { - do_highlight((char_u *)"Visual cterm=reverse ctermbg=NONE", - FALSE, TRUE); if (*p_bg == 'l') do_highlight((char_u *)"Search ctermfg=black", FALSE, TRUE); } @@ -1034,6 +1032,39 @@ highlight_set_ctermul(int idx, int color, int is_normal_group) hl_set_ctermul_normal_group(color); } +/* + * Set the cterm font for the highlight group at 'idx'. + * 'arg' is the color name or the numeric value as a string. + * 'init' is set to TRUE when initializing highlighting. + * Called for the ":highlight" command and the "hlset()" function. + * + * Returns TRUE if the font is set. + */ + static int +highlight_set_cterm_font( + int idx, + char_u *arg, + int init) +{ + int font; + + if (init && (HL_TABLE()[idx].sg_set & SG_CTERM)) + return FALSE; + + if (!init) + HL_TABLE()[idx].sg_set |= SG_CTERM; + + if (VIM_ISDIGIT(*arg)) + font = atoi((char *)arg); + else if (STRICMP(arg, "NONE") == 0) + font = -1; + else + return FALSE; + + HL_TABLE()[idx].sg_cterm_font = font + 1; + return TRUE; +} + /* * Set the cterm fg/bg/ul color for the highlight group at 'idx'. * 'key' is one of 'CTERMFG' or 'CTERMBG' or 'CTERMUL'. @@ -1679,6 +1710,14 @@ do_highlight( break; } } + else if (STRCMP(key, "CTERMFONT") == 0) + { + if (!highlight_set_cterm_font(idx, arg, init)) + { + error = TRUE; + break; + } + } else if (STRCMP(key, "GUIFG") == 0) { #if defined(FEAT_GUI) || defined(FEAT_EVAL) @@ -1865,6 +1904,7 @@ hl_has_settings(int idx, int check_link) || HL_TABLE()[idx].sg_cterm_attr != 0 || HL_TABLE()[idx].sg_cterm_fg != 0 || HL_TABLE()[idx].sg_cterm_bg != 0 + || HL_TABLE()[idx].sg_cterm_font != 0 #ifdef FEAT_GUI || HL_TABLE()[idx].sg_gui_attr != 0 || HL_TABLE()[idx].sg_gui_fg_name != NULL @@ -1892,6 +1932,7 @@ highlight_clear(int idx) HL_TABLE()[idx].sg_cterm_fg = 0; HL_TABLE()[idx].sg_cterm_bg = 0; HL_TABLE()[idx].sg_cterm_attr = 0; + HL_TABLE()[idx].sg_cterm_font = 0; #if defined(FEAT_GUI) || defined(FEAT_EVAL) HL_TABLE()[idx].sg_gui = 0; VIM_CLEAR(HL_TABLE()[idx].sg_gui_fg_name); @@ -2539,6 +2580,8 @@ get_attr_entry(garray_T *table, attrentry_T *aep) == taep->ae_u.cterm.bg_color && aep->ae_u.cterm.ul_color == taep->ae_u.cterm.ul_color + && aep->ae_u.cterm.font + == taep->ae_u.cterm.font #ifdef FEAT_TERMGUICOLORS && aep->ae_u.cterm.fg_rgb == taep->ae_u.cterm.fg_rgb @@ -2609,6 +2652,7 @@ get_attr_entry(garray_T *table, attrentry_T *aep) taep->ae_u.cterm.fg_color = aep->ae_u.cterm.fg_color; taep->ae_u.cterm.bg_color = aep->ae_u.cterm.bg_color; taep->ae_u.cterm.ul_color = aep->ae_u.cterm.ul_color; + taep->ae_u.cterm.font = aep->ae_u.cterm.font; #ifdef FEAT_TERMGUICOLORS taep->ae_u.cterm.fg_rgb = aep->ae_u.cterm.fg_rgb; taep->ae_u.cterm.bg_rgb = aep->ae_u.cterm.bg_rgb; @@ -2639,6 +2683,7 @@ get_cterm_attr_idx(int attr, int fg, int bg) at_en.ae_u.cterm.fg_color = fg; at_en.ae_u.cterm.bg_color = bg; at_en.ae_u.cterm.ul_color = 0; + at_en.ae_u.cterm.font = 0; return get_attr_entry(&cterm_attr_table, &at_en); } #endif @@ -2809,6 +2854,8 @@ hl_combine_attr(int char_attr, int prim_attr) new_en.ae_u.cterm.bg_color = prim_aep->ae_u.cterm.bg_color; if (prim_aep->ae_u.cterm.ul_color > 0) new_en.ae_u.cterm.ul_color = prim_aep->ae_u.cterm.ul_color; + if (prim_aep->ae_u.cterm.font > 0) + new_en.ae_u.cterm.font = prim_aep->ae_u.cterm.font; #ifdef FEAT_TERMGUICOLORS // If both fg and bg are not set fall back to cterm colors. // Helps for SpellBad which uses undercurl in the GUI. @@ -2948,6 +2995,8 @@ highlight_list_one(int id) sgp->sg_cterm_bg, NULL, "ctermbg"); didh = highlight_list_arg(id, didh, LIST_INT, sgp->sg_cterm_ul, NULL, "ctermul"); + didh = highlight_list_arg(id, didh, LIST_INT, + sgp->sg_cterm_font, NULL, "ctermfont"); #if defined(FEAT_GUI) || defined(FEAT_EVAL) didh = highlight_list_arg(id, didh, LIST_ATTR, @@ -3138,7 +3187,7 @@ highlight_color( return (HL_TABLE()[id - 1].sg_gui_sp_name); return (HL_TABLE()[id - 1].sg_gui_bg_name); } - if (font || sp) + if (sp) return NULL; if (modec == 'c') { @@ -3146,6 +3195,8 @@ highlight_color( n = HL_TABLE()[id - 1].sg_cterm_fg - 1; else if (ul) n = HL_TABLE()[id - 1].sg_cterm_ul - 1; + else if (font) + n = HL_TABLE()[id - 1].sg_cterm_font - 1; else n = HL_TABLE()[id - 1].sg_cterm_bg - 1; if (n < 0) @@ -3296,7 +3347,8 @@ set_hl_attr( // For the color term mode: If there are other than "normal" // highlighting attributes, need to allocate an attr number. - if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0 && sgp->sg_cterm_ul == 0 + if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0 && + sgp->sg_cterm_ul == 0 && sgp->sg_cterm_font == 0 # ifdef FEAT_TERMGUICOLORS && sgp->sg_gui_fg == INVALCOLOR && sgp->sg_gui_bg == INVALCOLOR @@ -3310,6 +3362,7 @@ set_hl_attr( at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg; at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg; at_en.ae_u.cterm.ul_color = sgp->sg_cterm_ul; + at_en.ae_u.cterm.font = sgp->sg_cterm_font; # ifdef FEAT_TERMGUICOLORS at_en.ae_u.cterm.fg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_fg); at_en.ae_u.cterm.bg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_bg); @@ -3717,6 +3770,8 @@ combine_stl_hlt( hlt[hlcnt + i].sg_cterm_fg = hlt[id - 1].sg_cterm_fg; if (hlt[id - 1].sg_cterm_bg != hlt[id_S - 1].sg_cterm_bg) hlt[hlcnt + i].sg_cterm_bg = hlt[id - 1].sg_cterm_bg; + if (hlt[id - 1].sg_cterm_font != hlt[id_S - 1].sg_cterm_font) + hlt[hlcnt + i].sg_cterm_font = hlt[id - 1].sg_cterm_font; # if defined(FEAT_GUI) || defined(FEAT_EVAL) hlt[hlcnt + i].sg_gui ^= hlt[id - 1].sg_gui ^ hlt[id_S - 1].sg_gui; @@ -4180,6 +4235,10 @@ highlight_get_info(int hl_idx, int resolve_link) if (dict_add_string(dict, "ctermul", highlight_color(hlgid, (char_u *)"ul", 'c')) == FAIL) goto error; + if (sgp->sg_cterm_font != 0) + if (dict_add_string(dict, "ctermfont", + highlight_color(hlgid, (char_u *)"font", 'c')) == FAIL) + goto error; if (sgp->sg_gui != 0) { attr_dict = highlight_get_attr_dict(sgp->sg_gui); @@ -4408,6 +4467,7 @@ hlg_add_or_update(dict_T *dict) char_u *ctermfg; char_u *ctermbg; char_u *ctermul; + char_u *ctermfont; char_u *guifg; char_u *guibg; char_u *guisp; @@ -4492,6 +4552,10 @@ hlg_add_or_update(dict_T *dict) if (error) return FALSE; + ctermfont = hldict_get_string(dict, (char_u *)"ctermfont", &error); + if (error) + return FALSE; + if (!hldict_attr_to_str(dict, (char_u *)"gui", gui_attr, sizeof(gui_attr))) return FALSE; @@ -4516,7 +4580,7 @@ hlg_add_or_update(dict_T *dict) // If none of the attributes are specified, then do nothing. if (term_attr[0] == NUL && start == NULL && stop == NULL && cterm_attr[0] == NUL && ctermfg == NULL && ctermbg == NULL - && ctermul == NULL && gui_attr[0] == NUL + && ctermul == NULL && ctermfont == NULL && gui_attr[0] == NUL # ifdef FEAT_GUI && font == NULL # endif @@ -4536,6 +4600,7 @@ hlg_add_or_update(dict_T *dict) p = add_attr_and_value(p, (char_u *)" ctermfg=", 9, ctermfg); p = add_attr_and_value(p, (char_u *)" ctermbg=", 9, ctermbg); p = add_attr_and_value(p, (char_u *)" ctermul=", 9, ctermul); + p = add_attr_and_value(p, (char_u *)" ctermfont=", 9, ctermfont); p = add_attr_and_value(p, (char_u *)" gui=", 5, gui_attr); # ifdef FEAT_GUI p = add_attr_and_value(p, (char_u *)" font=", 6, font); -- cgit v1.2.3