Patch 8.1.0933
Problem:    When using VTP scroll region isn't used properly.
Solution:   Make better use of the scroll region. (Nobuhiro Takasaki,
            closes #3974)
Files:      src/os_win32.c, src/term.c


*** ../vim-8.1.0932/src/os_win32.c      2019-02-16 14:07:34.326138106 +0100
--- src/os_win32.c      2019-02-16 16:44:59.511679299 +0100
***************
*** 171,176 ****
--- 171,179 ----
  static void scroll(unsigned cLines);
  static void set_scroll_region(unsigned left, unsigned top,
                              unsigned right, unsigned bottom);
+ static void set_scroll_region_tb(unsigned top, unsigned bottom);
+ static void set_scroll_region_lr(unsigned left, unsigned right);
+ static void insert_lines(unsigned cLines);
  static void delete_lines(unsigned cLines);
  static void gotoxy(unsigned x, unsigned y);
  static void standout(void);
***************
*** 5392,5398 ****
  
      if (handles[0] == INVALID_HANDLE_VALUE)
      {
!         CloseHandle(handles[1]);
        return FALSE;
      }
  
--- 5395,5401 ----
  
      if (handles[0] == INVALID_HANDLE_VALUE)
      {
!       CloseHandle(handles[1]);
        return FALSE;
      }
  
***************
*** 5976,5984 ****
      g_srScrollRegion.Top =    top;
      g_srScrollRegion.Right =  right;
      g_srScrollRegion.Bottom = bottom;
  
!     if (USE_VTP)
!       vtp_printf("\033[%d;%dr", top + 1, bottom + 1);
  }
  
  
--- 5979,6008 ----
      g_srScrollRegion.Top =    top;
      g_srScrollRegion.Right =  right;
      g_srScrollRegion.Bottom = bottom;
+ }
+ 
+     static void
+ set_scroll_region_tb(
+     unsigned top,
+     unsigned bottom)
+ {
+     if (top >= bottom || bottom > (unsigned)Rows - 1)
+       return;
  
!     g_srScrollRegion.Top = top;
!     g_srScrollRegion.Bottom = bottom;
! }
! 
!     static void
! set_scroll_region_lr(
!     unsigned left,
!     unsigned right)
! {
!     if (left >= right || right > (unsigned)Columns - 1)
!       return;
! 
!     g_srScrollRegion.Left = left;
!     g_srScrollRegion.Right = right;
  }
  
  
***************
*** 5988,6034 ****
      static void
  insert_lines(unsigned cLines)
  {
!     SMALL_RECT            source;
      COORD         dest;
      CHAR_INFO     fill;
  
!     dest.X = 0;
      dest.Y = g_coord.Y + cLines;
  
!     source.Left   = 0;
      source.Top          = g_coord.Y;
      source.Right  = g_srScrollRegion.Right;
      source.Bottom = g_srScrollRegion.Bottom - cLines;
  
!     if (!USE_VTP)
      {
        fill.Char.AsciiChar = ' ';
!       fill.Attributes = g_attrCurrent;
  
-       ScrollConsoleScreenBuffer(g_hConOut, &source, NULL, dest, &fill);
-     }
-     else
-     {
        set_console_color_rgb();
  
!       gotoxy(1, source.Top + 1);
!       vtp_printf("\033[%dT", cLines);
      }
! 
!     /* Here we have to deal with a win32 console flake: If the scroll
!      * region looks like abc and we scroll c to a and fill with d we get
!      * cbd... if we scroll block c one line at a time to a, we get cdd...
!      * vim expects cdd consistently... So we have to deal with that
!      * here... (this also occurs scrolling the same way in the other
!      * direction).  */
  
      if (source.Bottom < dest.Y)
      {
        COORD coord;
  
!       coord.X = 0;
!       coord.Y = source.Bottom;
!       clear_chars(coord, Columns * (dest.Y - source.Bottom));
      }
  }
  
--- 6012,6060 ----
      static void
  insert_lines(unsigned cLines)
  {
!     SMALL_RECT            source, clip;
      COORD         dest;
      CHAR_INFO     fill;
  
!     dest.X = g_srScrollRegion.Left;
      dest.Y = g_coord.Y + cLines;
  
!     source.Left   = g_srScrollRegion.Left;
      source.Top          = g_coord.Y;
      source.Right  = g_srScrollRegion.Right;
      source.Bottom = g_srScrollRegion.Bottom - cLines;
  
!     clip.Left   = g_srScrollRegion.Left;
!     clip.Top    = g_coord.Y;
!     clip.Right  = g_srScrollRegion.Right;
!     clip.Bottom = g_srScrollRegion.Bottom;
! 
      {
        fill.Char.AsciiChar = ' ';
!       fill.Attributes = g_attrDefault;
  
        set_console_color_rgb();
  
!       ScrollConsoleScreenBuffer(g_hConOut, &source, &clip, dest, &fill);
      }
!     // Here we have to deal with a win32 console flake: If the scroll
!     // region looks like abc and we scroll c to a and fill with d we get
!     // cbd... if we scroll block c one line at a time to a, we get cdd...
!     // vim expects cdd consistently... So we have to deal with that
!     // here... (this also occurs scrolling the same way in the other
!     // direction).
  
      if (source.Bottom < dest.Y)
      {
        COORD coord;
+       int   i;
  
!       coord.X = source.Left;
!       for (i = clip.Top; i < dest.Y; ++i)
!       {
!           coord.Y = i;
!           clear_chars(coord, source.Right - source.Left + 1);
!       }
      }
  }
  
***************
*** 6039,6088 ****
      static void
  delete_lines(unsigned cLines)
  {
!     SMALL_RECT            source;
      COORD         dest;
      CHAR_INFO     fill;
      int                   nb;
  
!     dest.X = 0;
      dest.Y = g_coord.Y;
  
!     source.Left   = 0;
      source.Top          = g_coord.Y + cLines;
      source.Right  = g_srScrollRegion.Right;
      source.Bottom = g_srScrollRegion.Bottom;
  
!     if (!USE_VTP)
      {
        fill.Char.AsciiChar = ' ';
!       fill.Attributes = g_attrCurrent;
  
-       ScrollConsoleScreenBuffer(g_hConOut, &source, NULL, dest, &fill);
-     }
-     else
-     {
        set_console_color_rgb();
  
!       gotoxy(1, source.Top + 1);
!       vtp_printf("\033[%dS", cLines);
      }
! 
!     /* Here we have to deal with a win32 console flake: If the scroll
!      * region looks like abc and we scroll c to a and fill with d we get
!      * cbd... if we scroll block c one line at a time to a, we get cdd...
!      * vim expects cdd consistently... So we have to deal with that
!      * here... (this also occurs scrolling the same way in the other
!      * direction).  */
  
      nb = dest.Y + (source.Bottom - source.Top) + 1;
  
      if (nb < source.Top)
      {
        COORD coord;
  
!       coord.X = 0;
!       coord.Y = nb;
!       clear_chars(coord, Columns * (source.Top - nb));
      }
  }
  
--- 6065,6112 ----
      static void
  delete_lines(unsigned cLines)
  {
!     SMALL_RECT            source, clip;
      COORD         dest;
      CHAR_INFO     fill;
      int                   nb;
  
!     dest.X = g_srScrollRegion.Left;
      dest.Y = g_coord.Y;
  
!     source.Left   = g_srScrollRegion.Left;
      source.Top          = g_coord.Y + cLines;
      source.Right  = g_srScrollRegion.Right;
      source.Bottom = g_srScrollRegion.Bottom;
  
!     clip.Left   = g_srScrollRegion.Left;
!     clip.Top    = g_coord.Y;
!     clip.Right  = g_srScrollRegion.Right;
!     clip.Bottom = g_srScrollRegion.Bottom;
! 
      {
        fill.Char.AsciiChar = ' ';
!       fill.Attributes = g_attrDefault;
  
        set_console_color_rgb();
  
!       ScrollConsoleScreenBuffer(g_hConOut, &source, &clip, dest, &fill);
      }
!     // Here we have to deal with a win32 console flake; See insert_lines()
!     // above.
  
      nb = dest.Y + (source.Bottom - source.Top) + 1;
  
      if (nb < source.Top)
      {
        COORD coord;
+       int   i;
  
!       coord.X = source.Left;
!       for (i = nb; i < clip.Bottom; ++i)
!       {
!           coord.Y = i;
!           clear_chars(coord, source.Right - source.Left + 1);
!       }
      }
  }
  
***************
*** 6508,6513 ****
--- 6532,6545 ----
                {
                    set_scroll_region(0, arg1 - 1, Columns - 1, arg2 - 1);
                }
+               else if (argc == 2 && *p == 'R')
+               {
+                   set_scroll_region_tb(arg1, arg2);
+               }
+               else if (argc == 2 && *p == 'V')
+               {
+                   set_scroll_region_lr(arg1, arg2);
+               }
                else if (argc == 1 && *p == 'A')
                {
                    gotoxy(g_coord.X + 1,
*** ../vim-8.1.0932/src/term.c  2019-02-12 20:46:45.247272511 +0100
--- src/term.c  2019-02-16 16:46:22.787339791 +0100
***************
*** 540,602 ****
   * are also translated in os_win32.c.
   */
      {(int)KS_NAME,    "win32"},
!     {(int)KS_CE,      "\033|K"},      /* clear to end of line */
!     {(int)KS_AL,      "\033|L"},      /* add new blank line */
  #  ifdef TERMINFO
!     {(int)KS_CAL,     "\033|%p1%dL"}, /* add number of new blank lines */
  #  else
!     {(int)KS_CAL,     "\033|%dL"},    /* add number of new blank lines */
  #  endif
!     {(int)KS_DL,      "\033|M"},      /* delete line */
  #  ifdef TERMINFO
!     {(int)KS_CDL,     "\033|%p1%dM"}, /* delete number of lines */
  #  else
!     {(int)KS_CDL,     "\033|%dM"},    /* delete number of lines */
  #  endif
!     {(int)KS_CL,      "\033|J"},      /* clear screen */
!     {(int)KS_CD,      "\033|j"},      /* clear to end of display */
!     {(int)KS_VI,      "\033|v"},      /* cursor invisible */
!     {(int)KS_VE,      "\033|V"},      /* cursor visible */
! 
!     {(int)KS_ME,      "\033|0m"},     /* normal */
!     {(int)KS_MR,      "\033|112m"},   /* reverse: black on lightgray */
!     {(int)KS_MD,      "\033|15m"},    /* bold: white on black */
  #if 1
!     {(int)KS_SO,      "\033|31m"},    /* standout: white on blue */
!     {(int)KS_SE,      "\033|0m"},     /* standout end */
  #else
!     {(int)KS_SO,      "\033|F"},      /* standout: high intensity */
!     {(int)KS_SE,      "\033|f"},      /* standout end */
  #endif
!     {(int)KS_CZH,     "\033|225m"},   /* italic: blue text on yellow */
!     {(int)KS_CZR,     "\033|0m"},     /* italic end */
!     {(int)KS_US,      "\033|67m"},    /* underscore: cyan text on red */
!     {(int)KS_UE,      "\033|0m"},     /* underscore end */
!     {(int)KS_CCO,     "16"},          /* allow 16 colors */
  #  ifdef TERMINFO
!     {(int)KS_CAB,     "\033|%p1%db"}, /* set background color */
!     {(int)KS_CAF,     "\033|%p1%df"}, /* set foreground color */
  #  else
!     {(int)KS_CAB,     "\033|%db"},    /* set background color */
!     {(int)KS_CAF,     "\033|%df"},    /* set foreground color */
  #  endif
  
!     {(int)KS_MS,      "y"},           /* save to move cur in reverse mode */
      {(int)KS_UT,      "y"},
      {(int)KS_XN,      "y"},
      {(int)KS_LE,      "\b"},
  #  ifdef TERMINFO
!     {(int)KS_CM,      "\033|%i%p1%d;%p2%dH"},/* cursor motion */
  #  else
!     {(int)KS_CM,      "\033|%i%d;%dH"},/* cursor motion */
  #  endif
!     {(int)KS_VB,      "\033|B"},      /* visual bell */
!     {(int)KS_TI,      "\033|S"},      /* put terminal in termcap mode */
!     {(int)KS_TE,      "\033|E"},      /* out of termcap mode */
  #  ifdef TERMINFO
!     {(int)KS_CS,      "\033|%i%p1%d;%p2%dr"},/* scroll region */
  #  else
!     {(int)KS_CS,      "\033|%i%d;%dr"},/* scroll region */
  #  endif
  #  ifdef FEAT_TERMGUICOLORS
      {(int)KS_8F,      "\033|38;2;%lu;%lu;%lum"},
--- 540,604 ----
   * are also translated in os_win32.c.
   */
      {(int)KS_NAME,    "win32"},
!     {(int)KS_CE,      "\033|K"},      // clear to end of line
!     {(int)KS_AL,      "\033|L"},      // add new blank line
  #  ifdef TERMINFO
!     {(int)KS_CAL,     "\033|%p1%dL"}, // add number of new blank lines
  #  else
!     {(int)KS_CAL,     "\033|%dL"},    // add number of new blank lines
  #  endif
!     {(int)KS_DL,      "\033|M"},      // delete line
  #  ifdef TERMINFO
!     {(int)KS_CDL,     "\033|%p1%dM"}, // delete number of lines
!     {(int)KS_CSV,     "\033|%p1%d;%p2%dV"},
  #  else
!     {(int)KS_CDL,     "\033|%dM"},    // delete number of lines
!     {(int)KS_CSV,     "\033|%d;%dV"},
  #  endif
!     {(int)KS_CL,      "\033|J"},      // clear screen
!     {(int)KS_CD,      "\033|j"},      // clear to end of display
!     {(int)KS_VI,      "\033|v"},      // cursor invisible
!     {(int)KS_VE,      "\033|V"},      // cursor visible
! 
!     {(int)KS_ME,      "\033|0m"},     // normal
!     {(int)KS_MR,      "\033|112m"},   // reverse: black on lightgray
!     {(int)KS_MD,      "\033|15m"},    // bold: white on black
  #if 1
!     {(int)KS_SO,      "\033|31m"},    // standout: white on blue
!     {(int)KS_SE,      "\033|0m"},     // standout end
  #else
!     {(int)KS_SO,      "\033|F"},      // standout: high intensity
!     {(int)KS_SE,      "\033|f"},      // standout end
  #endif
!     {(int)KS_CZH,     "\033|225m"},   // italic: blue text on yellow
!     {(int)KS_CZR,     "\033|0m"},     // italic end
!     {(int)KS_US,      "\033|67m"},    // underscore: cyan text on red
!     {(int)KS_UE,      "\033|0m"},     // underscore end
!     {(int)KS_CCO,     "16"},          // allow 16 colors
  #  ifdef TERMINFO
!     {(int)KS_CAB,     "\033|%p1%db"}, // set background color
!     {(int)KS_CAF,     "\033|%p1%df"}, // set foreground color
  #  else
!     {(int)KS_CAB,     "\033|%db"},    // set background color
!     {(int)KS_CAF,     "\033|%df"},    // set foreground color
  #  endif
  
!     {(int)KS_MS,      "y"},           // save to move cur in reverse mode
      {(int)KS_UT,      "y"},
      {(int)KS_XN,      "y"},
      {(int)KS_LE,      "\b"},
  #  ifdef TERMINFO
!     {(int)KS_CM,      "\033|%i%p1%d;%p2%dH"}, // cursor motion
  #  else
!     {(int)KS_CM,      "\033|%i%d;%dH"}, // cursor motion
  #  endif
!     {(int)KS_VB,      "\033|B"},      // visual bell
!     {(int)KS_TI,      "\033|S"},      // put terminal in termcap mode
!     {(int)KS_TE,      "\033|E"},      // out of termcap mode
  #  ifdef TERMINFO
!     {(int)KS_CS,      "\033|%i%p1%d;%p2%dr"}, // scroll region
  #  else
!     {(int)KS_CS,      "\033|%i%d;%dr"}, // scroll region
  #  endif
  #  ifdef FEAT_TERMGUICOLORS
      {(int)KS_8F,      "\033|38;2;%lu;%lu;%lum"},
***************
*** 6778,6786 ****
--- 6780,6792 ----
  #  ifdef TERMINFO
      {(int)KS_CAB, "\033|%p1%db", "\033|%p14%dm"}, // set background color
      {(int)KS_CAF, "\033|%p1%df", "\033|%p13%dm"}, // set foreground color
+     {(int)KS_CS,  "\033|%p1%d;%p2%dR", "\033|%p1%d;%p2%dR"},
+     {(int)KS_CSV, "\033|%p1%d;%p2%dV", "\033|%p1%d;%p2%dV"},
  #  else
      {(int)KS_CAB, "\033|%db", "\033|4%dm"}, // set background color
      {(int)KS_CAF, "\033|%df", "\033|3%dm"}, // set foreground color
+     {(int)KS_CS,  "\033|%d;%dR", "\033|%d;%dR"},
+     {(int)KS_CSV, "\033|%d;%dV", "\033|%d;%dV"},
  #  endif
      {(int)KS_CCO, "256", "256"},          // colors
      {(int)KS_NAME}                        // terminator
*** ../vim-8.1.0932/src/version.c       2019-02-16 15:09:21.225946157 +0100
--- src/version.c       2019-02-16 16:46:41.599260036 +0100
***************
*** 781,782 ****
--- 781,784 ----
  {   /* Add new patch number below this line */
+ /**/
+     933,
  /**/

-- 
FIRST VILLAGER: We have found a witch.  May we burn her?
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

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