diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-12-01 21:07:20 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-12-01 21:07:20 +0100 |
commit | a7c54cfcf825e8e99db03f4ccdb1a32cd0714c52 (patch) | |
tree | 2967da1b4011b77a7ea95da8d06f539dd675c7e7 | |
parent | 97ce419201421f65f4764549ed80307a7ef9c7a6 (diff) | |
download | vim-a7c54cfcf825e8e99db03f4ccdb1a32cd0714c52.zip |
patch 8.0.1362: terminal window colors wrong when using Terminal highlighting
Problem: Terminal window colors wrong when using Terminal highlighting.
Solution: Set ansi_index when setting the default color. Also cache the
color index for Terminal. (Ozaki Kiichi, closes #2393)
-rw-r--r-- | src/libvterm/src/pen.c | 2 | ||||
-rw-r--r-- | src/proto/terminal.pro | 1 | ||||
-rw-r--r-- | src/syntax.c | 12 | ||||
-rw-r--r-- | src/terminal.c | 45 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 40 insertions, 22 deletions
diff --git a/src/libvterm/src/pen.c b/src/libvterm/src/pen.c index e9a6de9bd..38c7a6e08 100644 --- a/src/libvterm/src/pen.c +++ b/src/libvterm/src/pen.c @@ -213,9 +213,7 @@ void vterm_state_get_palette_color(const VTermState *state, int index, VTermColo void vterm_state_set_default_colors(VTermState *state, const VTermColor *default_fg, const VTermColor *default_bg) { state->default_fg = *default_fg; - state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT; state->default_bg = *default_bg; - state->default_bg.ansi_index = VTERM_ANSI_INDEX_DEFAULT; } void vterm_state_set_palette_color(VTermState *state, int index, const VTermColor *col) diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro index 7f64b9006..4b39daa14 100644 --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -20,6 +20,7 @@ void term_change_in_curbuf(void); int term_get_attr(buf_T *buf, linenr_T lnum, int col); char_u *term_get_status_text(term_T *term); int set_ref_in_term(int copyID); +void set_terminal_default_colors(int cterm_fg, int cterm_bg); void f_term_getaltscreen(typval_T *argvars, typval_T *rettv); void f_term_getattr(typval_T *argvars, typval_T *rettv); void f_term_getcursor(typval_T *argvars, typval_T *rettv); diff --git a/src/syntax.c b/src/syntax.c index d733f5bcf..d247e0d16 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -7391,6 +7391,9 @@ 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 */ @@ -7616,6 +7619,10 @@ 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; @@ -8239,6 +8246,11 @@ do_highlight( } #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/terminal.c b/src/terminal.c index a2858a2b0..61630d5cc 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -188,6 +188,9 @@ static void term_free_vterm(term_T *term); * 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; /************************************** * 1. Generic code for all systems. @@ -1834,20 +1837,12 @@ cell2attr(VTermScreenCellAttrs cellattrs, VTermColor cellfg, VTermColor cellbg) int bg = color2index(&cellbg, FALSE, &bold); /* Use the "Terminal" highlighting for the default colors. */ - if (fg == 0 || bg == 0) + if ((fg == 0 || bg == 0) && t_colors >= 16) { - int id = syn_name2id((char_u *)"Terminal"); - - if (id != 0 && t_colors >= 16) - { - int cterm_fg, cterm_bg; - - syn_id2cterm_bg(id, &cterm_fg, &cterm_bg); - if (cterm_fg >= 0) - fg = cterm_fg + 1; - if (cterm_bg >= 0) - bg = cterm_bg + 1; - } + if (fg == 0 && term_default_cterm_fg >= 0) + fg = term_default_cterm_fg + 1; + if (bg == 0 && term_default_cterm_bg >= 0) + bg = term_default_cterm_bg + 1; } /* with 8 colors set the bold attribute to get a bright foreground */ @@ -2470,6 +2465,7 @@ cterm_color2rgb(int nr, VTermColor *rgb) rgb->blue = cube_value[idx % 6]; rgb->green = cube_value[idx / 6 % 6]; rgb->red = cube_value[idx / 36 % 6]; + rgb->ansi_index = VTERM_ANSI_INDEX_NONE; } else if (nr < 256) { @@ -2478,6 +2474,7 @@ cterm_color2rgb(int nr, VTermColor *rgb) rgb->blue = grey_ramp[idx]; rgb->green = grey_ramp[idx]; rgb->red = grey_ramp[idx]; + rgb->ansi_index = VTERM_ANSI_INDEX_NONE; } } @@ -2520,6 +2517,7 @@ create_vterm(term_T *term, int rows, int cols) } fg->red = fg->green = fg->blue = fgval; bg->red = bg->green = bg->blue = bgval; + fg->ansi_index = bg->ansi_index = VTERM_ANSI_INDEX_DEFAULT; /* The "Terminal" highlight group overrules the defaults. */ id = syn_name2id((char_u *)"Terminal"); @@ -2582,13 +2580,10 @@ create_vterm(term_T *term, int rows, int cols) #endif if (id != 0 && t_colors >= 16) { - int cterm_fg, cterm_bg; - - syn_id2cterm_bg(id, &cterm_fg, &cterm_bg); - if (cterm_fg >= 0) - cterm_color2rgb(cterm_fg, fg); - if (cterm_bg >= 0) - cterm_color2rgb(cterm_bg, bg); + if (term_default_cterm_fg >= 0) + cterm_color2rgb(term_default_cterm_fg, fg); + if (term_default_cterm_bg >= 0) + cterm_color2rgb(term_default_cterm_bg, bg); } else { @@ -2705,6 +2700,16 @@ set_ref_in_term(int copyID) } /* + * 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; +} + +/* * Get the buffer from the first argument in "argvars". * Returns NULL when the buffer is not for a terminal window. */ diff --git a/src/version.c b/src/version.c index 604fa4198..974ca2c03 100644 --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1362, +/**/ 1361, /**/ 1360, |