changeset 12433:735b49ff8fbb v8.0.1096

patch 8.0.1096: terminal window in Normal mode has wrong background commit https://github.com/vim/vim/commit/238d43b32859d1b4e6b7072d552289a748cbfee1 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Sep 11 22:00:51 2017 +0200 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.
author Christian Brabandt <cb@256bit.org>
date Mon, 11 Sep 2017 22:15:04 +0200
parents e635ff0a804f
children a0975c6fdf43
files src/screen.c src/terminal.c src/version.c
diffstat 3 files changed, 44 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -3139,6 +3139,7 @@ win_line(
 #endif
 #ifdef FEAT_TERMINAL
     int		get_term_attr = FALSE;
+    int		term_attr = 0;		/* background for terminal window */
 #endif
 
     /* draw_state: items that are drawn in sequence: */
@@ -3256,6 +3257,7 @@ win_line(
     {
 	extra_check = TRUE;
 	get_term_attr = TRUE;
+	term_attr = term_get_attr(wp->w_buffer, 0, 0);
     }
 #endif
 
@@ -5057,6 +5059,9 @@ win_line(
 # ifdef FEAT_DIFF
 			    diff_hlf != (hlf_T)0 ||
 # endif
+# ifdef FEAT_TERMINAL
+			    term_attr != 0 ||
+# endif
 			    line_attr != 0
 			) && (
 # ifdef FEAT_RIGHTLEFT
@@ -5091,6 +5096,15 @@ win_line(
 			}
 		    }
 # 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
 	    }
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -39,9 +39,6 @@
  *
  * TODO:
  * - 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
  * - Redirecting output does not work on MS-Windows.
  * - implement term_setsize()
@@ -130,6 +127,7 @@ struct terminal_S {
 
     garray_T	tl_scrollback;
     int		tl_scrollback_scrolled;
+    cellattr_T	tl_default_color;
 
     VTermPos	tl_cursor_pos;
     int		tl_cursor_visible;
@@ -2321,6 +2319,7 @@ term_change_in_curbuf(void)
 
 /*
  * Get the screen attribute for a position in the buffer.
+ * Use a zero "lnum" to get the default background color.
  */
     int
 term_get_attr(buf_T *buf, linenr_T lnum, int col)
@@ -2329,12 +2328,16 @@ term_get_attr(buf_T *buf, linenr_T lnum,
     sb_line_T	*line;
     cellattr_T	*cellattr;
 
-    if (lnum > term->tl_scrollback.ga_len)
-	return 0;
-    line = (sb_line_T *)term->tl_scrollback.ga_data + lnum - 1;
-    if (col >= line->sb_cols)
-	return 0;
-    cellattr = line->sb_cells + col;
+    if (lnum == 0 || lnum > term->tl_scrollback.ga_len)
+	cellattr = &term->tl_default_color;
+    else
+    {
+	line = (sb_line_T *)term->tl_scrollback.ga_data + lnum - 1;
+	if (col >= line->sb_cols)
+	    cellattr = &term->tl_default_color;
+	else
+	    cellattr = line->sb_cells + col;
+    }
     return cell2attr(cellattr->attrs, cellattr->fg, cellattr->bg);
 }
 
@@ -2347,6 +2350,8 @@ create_vterm(term_T *term, int rows, int
     VTerm	    *vterm;
     VTermScreen	    *screen;
     VTermValue	    value;
+    VTermColor	    *fg, *bg;
+    int		    fgval, bgval;
 
     vterm = vterm_new(rows, cols);
     term->tl_vterm = vterm;
@@ -2357,14 +2362,23 @@ create_vterm(term_T *term, int rows, int
 
     /* Vterm uses a default black background.  Set it to white when
      * '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')
     {
-	VTermColor	fg, bg;
-
-	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);
+	fgval = 0;
+	bgval = 255;
     }
+    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. */
     vterm_screen_reset(screen, 1 /* hard */);
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1096,
+/**/
     1095,
 /**/
     1094,