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.