Patch 8.0.1359
Problem:    Libvterm ANSI colors can not always be recognized from the RGB
            values. The default color is wrong when t_RB is empty.
Solution:   Add the ANSI color index to VTermColor.
Files:      src/libvterm/include/vterm.h, src/libvterm/src/pen.c,
            src/terminal.c


*** ../vim-8.0.1358/src/libvterm/include/vterm.h        2017-08-12 
19:51:37.815214191 +0200
--- src/libvterm/include/vterm.h        2017-11-29 21:32:22.756043108 +0100
***************
*** 79,86 ****
--- 79,94 ----
  }
  #endif
  
+ /* The ansi_index is used for the lower 16 colors, which can be set to any
+  * color. */
+ #define VTERM_ANSI_INDEX_DEFAULT 0    /* color cleared */
+ #define VTERM_ANSI_INDEX_MIN 1
+ #define VTERM_ANSI_INDEX_MAX 16
+ #define VTERM_ANSI_INDEX_NONE 255     /* non-ANSI color, use red/green/blue */
+ 
  typedef struct {
    uint8_t red, green, blue;
+   uint8_t ansi_index;
  } VTermColor;
  
  typedef enum {
*** ../vim-8.0.1358/src/libvterm/src/pen.c      2017-09-26 13:59:27.192906625 
+0200
--- src/libvterm/src/pen.c      2017-11-29 21:44:04.279843624 +0100
***************
*** 3,27 ****
  #include <stdio.h>
  
  static const VTermColor ansi_colors[] = {
!   /* R    G    B */
!   {   0,   0,   0 }, /* black */
!   { 224,   0,   0 }, /* red */
!   {   0, 224,   0 }, /* green */
!   { 224, 224,   0 }, /* yellow */
!   {   0,   0, 224 }, /* blue */
!   { 224,   0, 224 }, /* magenta */
!   {   0, 224, 224 }, /* cyan */
!   { 224, 224, 224 }, /* white == light grey */
  
    /* high intensity */
!   { 128, 128, 128 }, /* black */
!   { 255,  64,  64 }, /* red */
!   {  64, 255,  64 }, /* green */
!   { 255, 255,  64 }, /* yellow */
!   {  64,  64, 255 }, /* blue */
!   { 255,  64, 255 }, /* magenta */
!   {  64, 255, 255 }, /* cyan */
!   { 255, 255, 255 }, /* white for real */
  };
  
  static int ramp6[] = {
--- 3,27 ----
  #include <stdio.h>
  
  static const VTermColor ansi_colors[] = {
!   /* R    G    B   index */
!   {   0,   0,   0,  1 }, /* black */
!   { 224,   0,   0,  2 }, /* red */
!   {   0, 224,   0,  3 }, /* green */
!   { 224, 224,   0,  4 }, /* yellow */
!   {   0,   0, 224,  5 }, /* blue */
!   { 224,   0, 224,  6 }, /* magenta */
!   {   0, 224, 224,  7 }, /* cyan */
!   { 224, 224, 224,  8 }, /* white == light grey */
  
    /* high intensity */
!   { 128, 128, 128,  9 }, /* black */
!   { 255,  64,  64, 10 }, /* red */
!   {  64, 255,  64, 11 }, /* green */
!   { 255, 255,  64, 12 }, /* yellow */
!   {  64,  64, 255, 13 }, /* blue */
!   { 255,  64, 255, 14 }, /* magenta */
!   {  64, 255, 255, 15 }, /* cyan */
!   { 255, 255, 255, 16 }, /* white for real */
  };
  
  static int ramp6[] = {
***************
*** 57,62 ****
--- 57,63 ----
      col->blue  = ramp6[index     % 6];
      col->green = ramp6[index/6   % 6];
      col->red   = ramp6[index/6/6 % 6];
+     col->ansi_index = VTERM_ANSI_INDEX_NONE;
  
      return TRUE;
    }
***************
*** 67,72 ****
--- 68,74 ----
      col->blue  = ramp24[index];
      col->green = ramp24[index];
      col->red   = ramp24[index];
+     col->ansi_index = VTERM_ANSI_INDEX_NONE;
  
      return TRUE;
    }
***************
*** 84,89 ****
--- 86,92 ----
      col->red   = (uint8_t)CSI_ARG(args[0]);
      col->green = (uint8_t)CSI_ARG(args[1]);
      col->blue  = (uint8_t)CSI_ARG(args[2]);
+     col->ansi_index = VTERM_ANSI_INDEX_NONE;
  
      return 3;
  
***************
*** 152,158 ****
--- 155,163 ----
  
    /* 90% grey so that pure white is brighter */
    state->default_fg.red = state->default_fg.green = state->default_fg.blue = 
240;
+   state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
    state->default_bg.red = state->default_bg.green = state->default_bg.blue = 
0;
+   state->default_bg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
  
    for(col = 0; col < 16; col++)
      state->colors[col] = ansi_colors[col];
***************
*** 208,220 ****
--- 213,230 ----
  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)
  {
    if(index >= 0 && index < 16)
+   {
      state->colors[index] = *col;
+     state->colors[index].ansi_index = index + VTERM_ANSI_INDEX_MIN;
+   }
  }
  
  void vterm_state_set_bold_highbright(VTermState *state, int 
bold_is_highbright)
*** ../vim-8.0.1358/src/terminal.c      2017-11-21 18:11:23.657015881 +0100
--- src/terminal.c      2017-11-29 22:23:36.038758296 +0100
***************
*** 38,43 ****
--- 38,45 ----
   * in tl_scrollback are no longer used.
   *
   * TODO:
+  * - When using 'termguicolors' still use the 16 ANSI colors as-is.  Helps for
+  *   a job that uses 16 colors while Vim is using > 256.
   * - in GUI vertical split causes problems.  Cursor is flickering. (Hirohito
   *   Higashi, 2017 Sep 19)
   * - Shift-Tab does not work.
***************
*** 48,54 ****
   * - When closing gvim with an active terminal buffer, the dialog suggests
   *   saving the buffer.  Should say something else. (Manas Thakur, #2215)
   *   Also: #2223
-  * - implement term_setsize()
   * - Termdebug does not work when Vim build with mzscheme.  gdb hangs.
   * - MS-Windows GUI: WinBar has  tearoff item
   * - Adding WinBar to terminal window doesn't display, text isn't shifted 
down.
--- 50,55 ----
***************
*** 57,62 ****
--- 58,64 ----
   * - What to store in a session file?  Shell at the prompt would be OK to
   *   restore, but others may not.  Open the window and let the user start the
   *   command?
+  * - implement term_setsize()
   * - add test for giving error for invalid 'termsize' value.
   * - support minimal size when 'termsize' is "rows*cols".
   * - support minimal size when 'termsize' is empty?
***************
*** 1707,1713 ****
  
  /*
   * Reverse engineer the RGB value into a cterm color index.
!  * First color is 1.  Return 0 if no match found.
   */
      static int
  color2index(VTermColor *color, int fg, int *boldp)
--- 1709,1715 ----
  
  /*
   * Reverse engineer the RGB value into a cterm color index.
!  * First color is 1.  Return 0 if no match found (default color).
   */
      static int
  color2index(VTermColor *color, int fg, int *boldp)
***************
*** 1716,1793 ****
      int blue = color->blue;
      int green = color->green;
  
!     /* The argument for lookup_color() is for the color_names[] table. */
!     if (red == 0)
!     {
!       if (green == 0)
!       {
!           if (blue == 0)
!               return lookup_color(0, fg, boldp) + 1; /* black */
!           if (blue == 224)
!               return lookup_color(1, fg, boldp) + 1; /* dark blue */
!       }
!       else if (green == 224)
!       {
!           if (blue == 0)
!               return lookup_color(2, fg, boldp) + 1; /* dark green */
!           if (blue == 224)
!               return lookup_color(3, fg, boldp) + 1; /* dark cyan */
!       }
!     }
!     else if (red == 224)
!     {
!       if (green == 0)
!       {
!           if (blue == 0)
!               return lookup_color(4, fg, boldp) + 1; /* dark red */
!           if (blue == 224)
!               return lookup_color(5, fg, boldp) + 1; /* dark magenta */
!       }
!       else if (green == 224)
!       {
!           if (blue == 0)
!               return lookup_color(6, fg, boldp) + 1; /* dark yellow / brown */
!           if (blue == 224)
!               return lookup_color(8, fg, boldp) + 1; /* white / light grey */
!       }
!     }
!     else if (red == 128)
!     {
!       if (green == 128 && blue == 128)
!           return lookup_color(12, fg, boldp) + 1; /* dark grey */
!     }
!     else if (red == 255)
      {
!       if (green == 64)
!       {
!           if (blue == 64)
!               return lookup_color(20, fg, boldp) + 1;  /* light red */
!           if (blue == 255)
!               return lookup_color(22, fg, boldp) + 1;  /* light magenta */
!       }
!       else if (green == 255)
!       {
!           if (blue == 64)
!               return lookup_color(24, fg, boldp) + 1;  /* yellow */
!           if (blue == 255)
!               return lookup_color(26, fg, boldp) + 1;  /* white */
!       }
!     }
!     else if (red == 64)
!     {
!       if (green == 64)
!       {
!           if (blue == 255)
!               return lookup_color(14, fg, boldp) + 1;  /* light blue */
!       }
!       else if (green == 255)
!       {
!           if (blue == 64)
!               return lookup_color(16, fg, boldp) + 1;  /* light green */
!           if (blue == 255)
!               return lookup_color(18, fg, boldp) + 1;  /* light cyan */
        }
      }
      if (t_colors >= 256)
      {
        if (red == blue && red == green)
--- 1718,1751 ----
      int blue = color->blue;
      int green = color->green;
  
!     if (color->ansi_index != VTERM_ANSI_INDEX_NONE)
      {
!       /* First 16 colors and default: use the ANSI index, because these
!        * colors can be redefined. */
!       if (t_colors >= 16)
!           return color->ansi_index;
!       switch (color->ansi_index)
!       {
!           case  0: return 0;
!           case  1: return lookup_color( 0, fg, boldp) + 1;
!           case  2: return lookup_color( 4, fg, boldp) + 1; /* dark red */
!           case  3: return lookup_color( 2, fg, boldp) + 1; /* dark green */
!           case  4: return lookup_color( 6, fg, boldp) + 1; /* brown */
!           case  5: return lookup_color( 1, fg, boldp) + 1; /* dark blue*/
!           case  6: return lookup_color( 5, fg, boldp) + 1; /* dark magenta */
!           case  7: return lookup_color( 3, fg, boldp) + 1; /* dark cyan */
!           case  8: return lookup_color( 8, fg, boldp) + 1; /* light grey */
!           case  9: return lookup_color(12, fg, boldp) + 1; /* dark grey */
!           case 10: return lookup_color(20, fg, boldp) + 1; /* red */
!           case 11: return lookup_color(16, fg, boldp) + 1; /* green */
!           case 12: return lookup_color(24, fg, boldp) + 1; /* yellow */
!           case 13: return lookup_color(14, fg, boldp) + 1; /* blue */
!           case 14: return lookup_color(22, fg, boldp) + 1; /* magenta */
!           case 15: return lookup_color(18, fg, boldp) + 1; /* cyan */
!           case 16: return lookup_color(26, fg, boldp) + 1; /* white */
        }
      }
+ 
      if (t_colors >= 256)
      {
        if (red == blue && red == green)
***************
*** 2447,2469 ****
  }
  
  static VTermColor ansi_table[16] = {
!   {  0,   0,   0}, /* black */
!   {224,   0,   0}, /* dark red */
!   {  0, 224,   0}, /* dark green */
!   {224, 224,   0}, /* dark yellow / brown */
!   {  0,   0, 224}, /* dark blue */
!   {224,   0, 224}, /* dark magenta */
!   {  0, 224, 224}, /* dark cyan */
!   {224, 224, 224}, /* light grey */
! 
!   {128, 128, 128}, /* dark grey */
!   {255,  64,  64}, /* light red */
!   { 64, 255,  64}, /* light green */
!   {255, 255,  64}, /* yellow */
!   { 64,  64, 255}, /* light blue */
!   {255,  64, 255}, /* light magenta */
!   { 64, 255, 255}, /* light cyan */
!   {255, 255, 255}, /* white */
  };
  
  static int cube_value[] = {
--- 2405,2427 ----
  }
  
  static VTermColor ansi_table[16] = {
!   {  0,   0,   0,  1}, /* black */
!   {224,   0,   0,  2}, /* dark red */
!   {  0, 224,   0,  3}, /* dark green */
!   {224, 224,   0,  4}, /* dark yellow / brown */
!   {  0,   0, 224,  5}, /* dark blue */
!   {224,   0, 224,  6}, /* dark magenta */
!   {  0, 224, 224,  7}, /* dark cyan */
!   {224, 224, 224,  8}, /* light grey */
! 
!   {128, 128, 128,  9}, /* dark grey */
!   {255,  64,  64, 10}, /* light red */
!   { 64, 255,  64, 11}, /* light green */
!   {255, 255,  64, 12}, /* yellow */
!   { 64,  64, 255, 13}, /* light blue */
!   {255,  64, 255, 14}, /* light magenta */
!   { 64, 255, 255, 15}, /* light cyan */
!   {255, 255, 255, 16}, /* white */
  };
  
  static int cube_value[] = {
***************
*** 2549,2555 ****
      /* The "Terminal" highlight group overrules the defaults. */
      id = syn_name2id((char_u *)"Terminal");
  
!     /* Use the actual color for the GUI and when 'guitermcolors' is set. */
  #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
      if (0
  # ifdef FEAT_GUI
--- 2507,2513 ----
      /* The "Terminal" highlight group overrules the defaults. */
      id = syn_name2id((char_u *)"Terminal");
  
!     /* Use the actual color for the GUI and when 'termguicolors' is set. */
  #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
      if (0
  # ifdef FEAT_GUI
*** ../vim-8.0.1358/src/version.c       2017-11-28 21:25:16.903156177 +0100
--- src/version.c       2017-11-29 21:33:55.719480291 +0100
***************
*** 773,774 ****
--- 773,776 ----
  {   /* Add new patch number below this line */
+ /**/
+     1359,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
54. You start tilting your head sideways to smile. :-)

 /// 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