To: vim_dev@googlegroups.com Subject: Patch 8.1.0933 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///