0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.0.1096: terminal window in Normal mode has wrong background

Problem:    Terminal window in Normal mode has wrong background.
Solution:   Store the default background and use it for clearning until the
            end of the line.  Not for below the last line, since there is no
            text there.
This commit is contained in:
Bram Moolenaar
2017-09-11 22:00:51 +02:00
parent a038cb5eab
commit 238d43b328
3 changed files with 44 additions and 14 deletions

View File

@@ -3139,6 +3139,7 @@ win_line(
#endif #endif
#ifdef FEAT_TERMINAL #ifdef FEAT_TERMINAL
int get_term_attr = FALSE; int get_term_attr = FALSE;
int term_attr = 0; /* background for terminal window */
#endif #endif
/* draw_state: items that are drawn in sequence: */ /* draw_state: items that are drawn in sequence: */
@@ -3256,6 +3257,7 @@ win_line(
{ {
extra_check = TRUE; extra_check = TRUE;
get_term_attr = TRUE; get_term_attr = TRUE;
term_attr = term_get_attr(wp->w_buffer, 0, 0);
} }
#endif #endif
@@ -5056,6 +5058,9 @@ win_line(
else if (( else if ((
# ifdef FEAT_DIFF # ifdef FEAT_DIFF
diff_hlf != (hlf_T)0 || diff_hlf != (hlf_T)0 ||
# endif
# ifdef FEAT_TERMINAL
term_attr != 0 ||
# endif # endif
line_attr != 0 line_attr != 0
) && ( ) && (
@@ -5090,6 +5095,15 @@ win_line(
HL_ATTR(HLF_CUL)); HL_ATTR(HLF_CUL));
} }
} }
# endif
# ifdef FEAT_TERMINAL
if (term_attr != 0)
{
char_attr = term_attr;
if (wp->w_p_cul && lnum == wp->w_cursor.lnum)
char_attr = hl_combine_attr(char_attr,
HL_ATTR(HLF_CUL));
}
# endif # endif
} }
#endif #endif

View File

@@ -39,9 +39,6 @@
* *
* TODO: * TODO:
* - patch to use GUI or cterm colors for vterm. Yasuhiro, #2067 * - patch to use GUI or cterm colors for vterm. Yasuhiro, #2067
* - when Normal background is not white or black, going to Terminal-Normal
* mode does not clear correctly. Use the terminal background color to erase
* the background.
* - patch to add tmap, jakalope (Jacob Askeland) #2073 * - patch to add tmap, jakalope (Jacob Askeland) #2073
* - Redirecting output does not work on MS-Windows. * - Redirecting output does not work on MS-Windows.
* - implement term_setsize() * - implement term_setsize()
@@ -130,6 +127,7 @@ struct terminal_S {
garray_T tl_scrollback; garray_T tl_scrollback;
int tl_scrollback_scrolled; int tl_scrollback_scrolled;
cellattr_T tl_default_color;
VTermPos tl_cursor_pos; VTermPos tl_cursor_pos;
int tl_cursor_visible; int tl_cursor_visible;
@@ -2321,6 +2319,7 @@ term_change_in_curbuf(void)
/* /*
* Get the screen attribute for a position in the buffer. * Get the screen attribute for a position in the buffer.
* Use a zero "lnum" to get the default background color.
*/ */
int int
term_get_attr(buf_T *buf, linenr_T lnum, int col) term_get_attr(buf_T *buf, linenr_T lnum, int col)
@@ -2329,12 +2328,16 @@ term_get_attr(buf_T *buf, linenr_T lnum, int col)
sb_line_T *line; sb_line_T *line;
cellattr_T *cellattr; cellattr_T *cellattr;
if (lnum > term->tl_scrollback.ga_len) if (lnum == 0 || lnum > term->tl_scrollback.ga_len)
return 0; cellattr = &term->tl_default_color;
line = (sb_line_T *)term->tl_scrollback.ga_data + lnum - 1; else
if (col >= line->sb_cols) {
return 0; line = (sb_line_T *)term->tl_scrollback.ga_data + lnum - 1;
cellattr = line->sb_cells + col; if (col >= line->sb_cols)
cellattr = &term->tl_default_color;
else
cellattr = line->sb_cells + col;
}
return cell2attr(cellattr->attrs, cellattr->fg, cellattr->bg); return cell2attr(cellattr->attrs, cellattr->fg, cellattr->bg);
} }
@@ -2347,6 +2350,8 @@ create_vterm(term_T *term, int rows, int cols)
VTerm *vterm; VTerm *vterm;
VTermScreen *screen; VTermScreen *screen;
VTermValue value; VTermValue value;
VTermColor *fg, *bg;
int fgval, bgval;
vterm = vterm_new(rows, cols); vterm = vterm_new(rows, cols);
term->tl_vterm = vterm; term->tl_vterm = vterm;
@@ -2357,14 +2362,23 @@ create_vterm(term_T *term, int rows, int cols)
/* Vterm uses a default black background. Set it to white when /* Vterm uses a default black background. Set it to white when
* 'background' is "light". */ * 'background' is "light". */
vim_memset(&term->tl_default_color.attrs, 0, sizeof(VTermScreenCellAttrs));
term->tl_default_color.width = 1;
fg = &term->tl_default_color.fg;
bg = &term->tl_default_color.bg;
if (*p_bg == 'l') if (*p_bg == 'l')
{ {
VTermColor fg, bg; fgval = 0;
bgval = 255;
fg.red = fg.green = fg.blue = 0;
bg.red = bg.green = bg.blue = 255;
vterm_state_set_default_colors(vterm_obtain_state(vterm), &fg, &bg);
} }
else
{
fgval = 255;
bgval = 0;
}
fg->red = fg->green = fg->blue = fgval;
bg->red = bg->green = bg->blue = bgval;
vterm_state_set_default_colors(vterm_obtain_state(vterm), fg, bg);
/* Required to initialize most things. */ /* Required to initialize most things. */
vterm_screen_reset(screen, 1 /* hard */); vterm_screen_reset(screen, 1 /* hard */);

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1096,
/**/ /**/
1095, 1095,
/**/ /**/