# HG changeset patch # User Bram Moolenaar # Date 1634333404 -7200 # Node ID 1266292376c785a2bf7a68982fc6d4a8eecdc73c # Parent 0cc536850b7edc0f4515ba292de9a35dcf13ca50 patch 8.2.3516: terminal window does not have transparent background Commit: https://github.com/vim/vim/commit/7b5f45be2197403d631b5a3d633f6a20afdf806e Author: Milly Date: Fri Oct 15 22:25:43 2021 +0100 patch 8.2.3516: terminal window does not have transparent background Problem: Terminal window does not have transparent background when 'termguicolors' is used. Solution: Fix the background color. (closes #2361, closes #9002) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -168,9 +168,6 @@ terminal window will start with a white To use a different color the Terminal highlight group can be used, for example: > hi Terminal ctermbg=lightgrey ctermfg=blue guibg=lightgrey guifg=blue -The highlight needs to be defined before the terminal is created. Doing it -later, or setting 'wincolor', will only have effect when the program running -in the terminal displays text or clears the terminal. Instead of Terminal another group can be specified with the "term_highlight" option for `term_start()`. diff --git a/src/highlight.c b/src/highlight.c --- a/src/highlight.c +++ b/src/highlight.c @@ -641,9 +641,6 @@ do_highlight( int error = FALSE; int color; int is_normal_group = FALSE; // "Normal" group -#ifdef FEAT_TERMINAL - int is_terminal_group = FALSE; // "Terminal" group -#endif #ifdef FEAT_GUI_X11 int is_menu_group = FALSE; // "Menu" group int is_scrollbar_group = FALSE; // "Scrollbar" group @@ -882,10 +879,6 @@ do_highlight( if (STRCMP(HL_TABLE()[idx].sg_name_u, "NORMAL") == 0) is_normal_group = TRUE; -#ifdef FEAT_TERMINAL - else if (STRCMP(HL_TABLE()[idx].sg_name_u, "TERMINAL") == 0) - is_terminal_group = TRUE; -#endif #ifdef FEAT_GUI_X11 else if (STRCMP(HL_TABLE()[idx].sg_name_u, "MENU") == 0) is_menu_group = TRUE; @@ -1534,11 +1527,6 @@ do_highlight( control_console_color_rgb(); #endif } -#ifdef FEAT_TERMINAL - else if (is_terminal_group) - set_terminal_default_colors( - HL_TABLE()[idx].sg_cterm_fg, HL_TABLE()[idx].sg_cterm_bg); -#endif #ifdef FEAT_GUI_X11 # ifdef FEAT_MENU else if (is_menu_group) diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -19,7 +19,6 @@ cursorentry_T *term_get_cursor_shape(gui int term_use_loop(void); void term_win_entered(void); int terminal_loop(int blocking); -void set_terminal_default_colors(int cterm_fg, int cterm_bg); int may_close_term_popup(void); void term_channel_closed(channel_T *ch); void term_check_channel_closed_recently(void); diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -204,10 +204,6 @@ static void handle_postponed_scrollback( // backspace key. static int term_backspace_char = BS; -// "Terminal" highlight group colors. -static int term_default_cterm_fg = -1; -static int term_default_cterm_bg = -1; - // Store the last set and the desired cursor properties, so that we only update // them when needed. Doing it unnecessary may result in flicker. static char_u *last_set_cursor_color = NULL; @@ -2722,48 +2718,6 @@ may_toggle_cursor(term_T *term) } /* - * Cache "Terminal" highlight group colors. - */ - void -set_terminal_default_colors(int cterm_fg, int cterm_bg) -{ - term_default_cterm_fg = cterm_fg - 1; - term_default_cterm_bg = cterm_bg - 1; -} - - static int -get_default_cterm_fg(term_T *term) -{ - if (term->tl_highlight_name != NULL) - { - int id = syn_name2id(term->tl_highlight_name); - int fg = -1; - int bg = -1; - - if (id > 0) - syn_id2cterm_bg(id, &fg, &bg); - return fg; - } - return term_default_cterm_fg; -} - - static int -get_default_cterm_bg(term_T *term) -{ - if (term->tl_highlight_name != NULL) - { - int id = syn_name2id(term->tl_highlight_name); - int fg = -1; - int bg = -1; - - if (id > 0) - syn_id2cterm_bg(id, &fg, &bg); - return bg; - } - return term_default_cterm_bg; -} - -/* * Reverse engineer the RGB value into a cterm color index. * First color is 1. Return 0 if no match found (default color). */ @@ -2909,10 +2863,34 @@ cell2attr( #ifdef FEAT_TERMGUICOLORS if (p_tgc) { - guicolor_T fg, bg; - - fg = gui_get_rgb_color_cmn(cellfg.red, cellfg.green, cellfg.blue); - bg = gui_get_rgb_color_cmn(cellbg.red, cellbg.green, cellbg.blue); + guicolor_T fg = INVALCOLOR; + guicolor_T bg = INVALCOLOR; + + // Use the 'wincolor' or "Terminal" highlighting for the default + // colors. + if (VTERM_COLOR_IS_DEFAULT_FG(&cellfg) + || VTERM_COLOR_IS_DEFAULT_BG(&cellbg)) + { + int id = 0; + + if (wp != NULL && *wp->w_p_wcr != NUL) + id = syn_name2id(wp->w_p_wcr); + if (id == 0) + id = syn_name2id(term_get_highlight_name(term)); + if (id > 0) + syn_id2colors(id, &fg, &bg); + if (!VTERM_COLOR_IS_DEFAULT_FG(&cellfg)) + fg = gui_get_rgb_color_cmn(cellfg.red, cellfg.green, + cellfg.blue); + if (!VTERM_COLOR_IS_DEFAULT_BG(&cellbg)) + bg = gui_get_rgb_color_cmn(cellbg.red, cellbg.green, + cellbg.blue); + } + else + { + fg = gui_get_rgb_color_cmn(cellfg.red, cellfg.green, cellfg.blue); + bg = gui_get_rgb_color_cmn(cellbg.red, cellbg.green, cellbg.blue); + } return get_tgc_attr_idx(attr, fg, bg); } @@ -2927,41 +2905,20 @@ cell2attr( // colors. if ((fg == 0 || bg == 0) && t_colors >= 16) { - int wincolor_fg = -1; - int wincolor_bg = -1; + int cterm_fg = -1; + int cterm_bg = -1; + int id = 0; if (wp != NULL && *wp->w_p_wcr != NUL) - { - int id = syn_name2id(curwin->w_p_wcr); - - // Get the 'wincolor' group colors. - if (id > 0) - syn_id2cterm_bg(id, &wincolor_fg, &wincolor_bg); - } - if (fg == 0) - { - if (wincolor_fg >= 0) - fg = wincolor_fg + 1; - else - { - int cterm_fg = get_default_cterm_fg(term); - - if (cterm_fg >= 0) - fg = cterm_fg + 1; - } - } - if (bg == 0) - { - if (wincolor_bg >= 0) - bg = wincolor_bg + 1; - else - { - int cterm_bg = get_default_cterm_bg(term); - - if (cterm_bg >= 0) - bg = cterm_bg + 1; - } - } + id = syn_name2id(wp->w_p_wcr); + if (id == 0) + id = syn_name2id(term_get_highlight_name(term)); + if (id > 0) + syn_id2cterm_bg(id, &cterm_fg, &cterm_bg); + if (fg == 0 && cterm_fg >= 0) + fg = cterm_fg + 1; + if (bg == 0 && cterm_bg >= 0) + bg = cterm_bg + 1; } // with 8 colors set the bold attribute to get a bright foreground @@ -4041,8 +3998,9 @@ init_default_colors(term_T *term, win_T #endif if (id != 0 && t_colors >= 16) { - int cterm_fg = get_default_cterm_fg(term); - int cterm_bg = get_default_cterm_bg(term); + int cterm_fg = -1; + int cterm_bg = -1; + syn_id2cterm_bg(id, &cterm_fg, &cterm_bg); if (cterm_fg >= 0) cterm_color2vterm(cterm_fg, fg); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3516, +/**/ 3515, /**/ 3514,