Patch 8.0.1097 (after 8.0.1096)
Problem:    Background color wrong if job changes background color.
Solution:   Get the background color from vterm.
Files:      src/terminal.c, src/screen.c

*** ../vim-8.0.1096/src/terminal.c      2017-09-11 22:00:46.952401314 +0200
--- src/terminal.c      2017-09-11 23:02:28.410296783 +0200
***************
*** 85,90 ****
--- 85,91 ----
  typedef struct sb_line_S {
      int               sb_cols;        /* can differ per line */
      cellattr_T        *sb_cells;      /* allocated */
+     cellattr_T        sb_fill_attr;   /* for short line */
  } sb_line_T;
  
  /* typedef term_T in structs.h */
***************
*** 943,948 ****
--- 944,971 ----
      }
  }
  
+     static void
+ cell2cellattr(const VTermScreenCell *cell, cellattr_T *attr)
+ {
+     attr->width = cell->width;
+     attr->attrs = cell->attrs;
+     attr->fg = cell->fg;
+     attr->bg = cell->bg;
+ }
+ 
+     static int
+ equal_celattr(cellattr_T *a, cellattr_T *b)
+ {
+     /* Comparing the colors should be sufficient. */
+     return a->fg.red == b->fg.red
+       && a->fg.green == b->fg.green
+       && a->fg.blue == b->fg.blue
+       && a->bg.red == b->bg.red
+       && a->bg.green == b->bg.green
+       && a->bg.blue == b->bg.blue;
+ }
+ 
+ 
  /*
   * Add the current lines of the terminal to scrollback and to the buffer.
   * Called after the job has ended and when switching to Terminal-Normal mode.
***************
*** 955,975 ****
      int                   lines_skipped = 0;
      VTermPos      pos;
      VTermScreenCell cell;
      cellattr_T            *p;
      VTermScreen           *screen;
  
      if (term->tl_vterm == NULL)
        return;
      screen = vterm_obtain_screen(term->tl_vterm);
      for (pos.row = 0; pos.row < term->tl_rows; ++pos.row)
      {
        len = 0;
        for (pos.col = 0; pos.col < term->tl_cols; ++pos.col)
            if (vterm_screen_get_cell(screen, pos, &cell) != 0
                                                       && cell.chars[0] != NUL)
                len = pos.col + 1;
  
!       if (len == 0)
            ++lines_skipped;
        else
        {
--- 978,1007 ----
      int                   lines_skipped = 0;
      VTermPos      pos;
      VTermScreenCell cell;
+     cellattr_T            fill_attr, new_fill_attr;
      cellattr_T            *p;
      VTermScreen           *screen;
  
      if (term->tl_vterm == NULL)
        return;
      screen = vterm_obtain_screen(term->tl_vterm);
+     fill_attr = new_fill_attr = term->tl_default_color;
+ 
      for (pos.row = 0; pos.row < term->tl_rows; ++pos.row)
      {
        len = 0;
        for (pos.col = 0; pos.col < term->tl_cols; ++pos.col)
            if (vterm_screen_get_cell(screen, pos, &cell) != 0
                                                       && cell.chars[0] != NUL)
+           {
                len = pos.col + 1;
+               new_fill_attr = term->tl_default_color;
+           }
+           else
+               /* Assume the last attr is the filler attr. */
+               cell2cellattr(&cell, &new_fill_attr);
  
!       if (len == 0 && equal_celattr(&new_fill_attr, &fill_attr))
            ++lines_skipped;
        else
        {
***************
*** 984,997 ****
  
                    line->sb_cols = 0;
                    line->sb_cells = NULL;
                    ++term->tl_scrollback.ga_len;
  
                    add_scrollback_line_to_buffer(term, (char_u *)"", 0);
                }
            }
  
!           p = (cellattr_T *)alloc((int)sizeof(cellattr_T) * len);
!           if (p != NULL && ga_grow(&term->tl_scrollback, 1) == OK)
            {
                garray_T    ga;
                int         width;
--- 1016,1034 ----
  
                    line->sb_cols = 0;
                    line->sb_cells = NULL;
+                   line->sb_fill_attr = fill_attr;
                    ++term->tl_scrollback.ga_len;
  
                    add_scrollback_line_to_buffer(term, (char_u *)"", 0);
                }
            }
  
!           if (len == 0)
!               p = NULL;
!           else
!               p = (cellattr_T *)alloc((int)sizeof(cellattr_T) * len);
!           if ((p != NULL || len == 0)
!                                    && ga_grow(&term->tl_scrollback, 1) == OK)
            {
                garray_T    ga;
                int         width;
***************
*** 1013,1022 ****
                    {
                        width = cell.width;
  
!                       p[pos.col].width = cell.width;
!                       p[pos.col].attrs = cell.attrs;
!                       p[pos.col].fg = cell.fg;
!                       p[pos.col].bg = cell.bg;
  
                        if (ga_grow(&ga, MB_MAXBYTES) == OK)
                        {
--- 1050,1056 ----
                    {
                        width = cell.width;
  
!                       cell2cellattr(&cell, &p[pos.col]);
  
                        if (ga_grow(&ga, MB_MAXBYTES) == OK)
                        {
***************
*** 1031,1036 ****
--- 1065,1072 ----
                }
                line->sb_cols = len;
                line->sb_cells = p;
+               line->sb_fill_attr = new_fill_attr;
+               fill_attr = new_fill_attr;
                ++term->tl_scrollback.ga_len;
  
                if (ga_grow(&ga, 1) == FAIL)
***************
*** 1047,1052 ****
--- 1083,1092 ----
        }
      }
  
+     /* Obtain the current background color. */
+     vterm_state_get_default_colors(vterm_obtain_state(term->tl_vterm),
+                      &term->tl_default_color.fg, &term->tl_default_color.bg);
+ 
      FOR_ALL_WINDOWS(wp)
      {
        if (wp->w_buffer == term->tl_buffer)
***************
*** 2003,2013 ****
--- 2043,2056 ----
        int             col;
        sb_line_T       *line;
        garray_T        ga;
+       cellattr_T      fill_attr = term->tl_default_color;
  
        /* do not store empty cells at the end */
        for (i = 0; i < cols; ++i)
            if (cells[i].chars[0] != 0)
                len = i + 1;
+           else
+               cell2cellattr(&cells[i], &fill_attr);
  
        ga_init2(&ga, 1, 100);
        if (len > 0)
***************
*** 2024,2033 ****
                for (i = 0; (c = cells[col].chars[i]) > 0 || i == 0; ++i)
                    ga.ga_len += utf_char2bytes(c == NUL ? ' ' : c,
                                             (char_u *)ga.ga_data + ga.ga_len);
!               p[col].width = cells[col].width;
!               p[col].attrs = cells[col].attrs;
!               p[col].fg = cells[col].fg;
!               p[col].bg = cells[col].bg;
            }
        }
        if (ga_grow(&ga, 1) == FAIL)
--- 2067,2073 ----
                for (i = 0; (c = cells[col].chars[i]) > 0 || i == 0; ++i)
                    ga.ga_len += utf_char2bytes(c == NUL ? ' ' : c,
                                             (char_u *)ga.ga_data + ga.ga_len);
!               cell2cellattr(&cells[col], &p[col]);
            }
        }
        if (ga_grow(&ga, 1) == FAIL)
***************
*** 2043,2048 ****
--- 2083,2089 ----
                                                  + term->tl_scrollback.ga_len;
        line->sb_cols = len;
        line->sb_cells = p;
+       line->sb_fill_attr = fill_attr;
        ++term->tl_scrollback.ga_len;
        ++term->tl_scrollback_scrolled;
      }
***************
*** 2319,2325 ****
  
  /*
   * 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)
--- 2360,2366 ----
  
  /*
   * Get the screen attribute for a position in the buffer.
!  * Use a negative "col" to get the filler background color.
   */
      int
  term_get_attr(buf_T *buf, linenr_T lnum, int col)
***************
*** 2328,2340 ****
      sb_line_T *line;
      cellattr_T        *cellattr;
  
!     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;
      }
--- 2369,2381 ----
      sb_line_T *line;
      cellattr_T        *cellattr;
  
!     if (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 < 0 || col >= line->sb_cols)
!           cellattr = &line->sb_fill_attr;
        else
            cellattr = line->sb_cells + col;
      }
*** ../vim-8.0.1096/src/screen.c        2017-09-11 22:00:46.952401314 +0200
--- src/screen.c        2017-09-11 22:42:18.017569465 +0200
***************
*** 3257,3263 ****
      {
        extra_check = TRUE;
        get_term_attr = TRUE;
!       term_attr = term_get_attr(wp->w_buffer, 0, 0);
      }
  #endif
  
--- 3257,3263 ----
      {
        extra_check = TRUE;
        get_term_attr = TRUE;
!       term_attr = term_get_attr(wp->w_buffer, lnum, -1);
      }
  #endif
  
*** ../vim-8.0.1096/src/version.c       2017-09-11 22:00:46.952401314 +0200
--- src/version.c       2017-09-11 22:08:42.021592743 +0200
***************
*** 771,772 ****
--- 771,774 ----
  {   /* Add new patch number below this line */
+ /**/
+     1097,
  /**/

-- 
A meeting is an event at which the minutes are kept and the hours are lost.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui