changeset 31839:d156287184f6 v9.0.1252

patch 9.0.1252: MS-Windows: scrollback cropped off on Vim exit Commit: https://github.com/vim/vim/commit/f75a2cb3c7db6244fd7e3eee75c85d40a1614fa0 Author: Christopher Plewright <chris@createng.com> Date: Sat Jan 28 10:28:09 2023 +0000 patch 9.0.1252: MS-Windows: scrollback cropped off on Vim exit Problem: MS-Windows: scrollback cropped off on Vim exit. Solution: Don't call SetConsoleScreenBufferInfoEx when using the alternate screen buffer. (Christopher Plewright, closes #11882)
author Bram Moolenaar <Bram@vim.org>
date Sat, 28 Jan 2023 11:30:05 +0100
parents 35d3dca6748b
children 4c06d7b151fc
files src/os_win32.c src/version.c
diffstat 2 files changed, 32 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -232,7 +232,8 @@ static guicolor_T store_console_bg_rgb;
 static guicolor_T store_console_fg_rgb;
 static int default_console_color_bg = 0x000000; // black
 static int default_console_color_fg = 0xc0c0c0; // white
-#  define USE_VTP		(vtp_working && is_term_win32())
+#  define USE_VTP		(vtp_working && is_term_win32() \
+						 && (p_tgc || t_colors >= 256))
 #  define USE_WT		(wt_working)
 # else
 #  define USE_VTP		0
@@ -3463,6 +3464,9 @@ mch_init_c(void)
     ui_get_shellsize();
 
     vtp_init();
+    // Switch to a new alternate screen buffer.
+    if (use_alternate_screen_buffer)
+	vtp_printf("\033[?1049h");
 
 # ifdef MCH_WRITE_DUMP
     fdDump = fopen("dump", "wt");
@@ -4437,6 +4441,9 @@ ResizeConBuf(
     HANDLE  hConsole,
     COORD   coordScreen)
 {
+    if (use_alternate_screen_buffer)
+	return;
+
     if (!SetConsoleScreenBufferSize(hConsole, coordScreen))
     {
 # ifdef MCH_WRITE_DUMP
@@ -6189,12 +6196,6 @@ termcap_mode_start(void)
     if (g_fTermcapMode)
 	return;
 
-    // VTP uses alternate screen buffer.
-    // Switch to a new alternate screen buffer.
-    // But, not if running in a nested terminal
-    if (use_alternate_screen_buffer)
-	vtp_printf("\033[?1049h");
-
     SaveConsoleBuffer(&g_cbNonTermcap);
 
     if (g_cbTermcap.IsValid)
@@ -6273,7 +6274,6 @@ termcap_mode_end(void)
     RestoreConsoleBuffer(cb, p_rs);
     restore_console_color_rgb();
 
-    // VTP uses alternate screen buffer.
     // Switch back to main screen buffer.
     if (exiting && use_alternate_screen_buffer)
 	vtp_printf("\033[?1049l");
@@ -6285,9 +6285,8 @@ termcap_mode_end(void)
 	 */
 	coord.X = 0;
 	coord.Y = (SHORT) (p_rs ? cb->Info.dwCursorPosition.Y : (Rows - 1));
-	if (!vtp_working)
-	    FillConsoleOutputCharacter(g_hConOut, ' ',
-		    cb->Info.dwSize.X, coord, &dwDummy);
+	FillConsoleOutputCharacter(g_hConOut, ' ',
+		cb->Info.dwSize.X, coord, &dwDummy);
 	/*
 	 * The following is just for aesthetics.  If we are exiting without
 	 * restoring the screen, then we want to have a prompt string
@@ -6497,11 +6496,7 @@ insert_lines(unsigned cLines)
     clip.Bottom = g_srScrollRegion.Bottom;
 
     fill.Char.AsciiChar = ' ';
-    if (!(vtp_working
-# ifdef FEAT_TERMGUICOLORS
-		&& (p_tgc || t_colors >= 256)
-# endif
-	 ))
+    if (!USE_VTP)
 	fill.Attributes = g_attrCurrent;
     else
 	fill.Attributes = g_attrDefault;
@@ -6625,11 +6620,7 @@ gotoxy(
     if (x < 1 || x > (unsigned)Columns || y < 1 || y > (unsigned)Rows)
 	return;
 
-    if (!(vtp_working
-# ifdef FEAT_TERMGUICOLORS
-		&& (p_tgc || t_colors >= 256)
-# endif
-	 ))
+    if (!USE_VTP)
     {
 	// There are reports of double-width characters not displayed
 	// correctly.  This workaround should fix it, similar to how it's done
@@ -6883,11 +6874,7 @@ write_chars(
 	}
     }
 
-    if (!(vtp_working
-# ifdef FEAT_TERMGUICOLORS
-	    && (p_tgc || t_colors >= 256)
-# endif
-	))
+    if (!USE_VTP)
     {
 	FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cells,
 				    coord, &written);
@@ -6927,11 +6914,7 @@ write_chars(
     }
 
     // Cursor under VTP is always in the correct position, no need to reset.
-    if (!(vtp_working
-# ifdef FEAT_TERMGUICOLORS
-		&& (p_tgc || t_colors >= 256)
-# endif
-	 ))
+    if (!USE_VTP)
 	gotoxy(g_coord.X + 1, g_coord.Y + 1);
 
     return written;
@@ -7227,11 +7210,7 @@ notsgr:
 			normvideo();
 		    else if (argc == 1)
 		    {
-			if (vtp_working
-# ifdef FEAT_TERMGUICOLORS
-				&& (p_tgc || t_colors >= 256)
-# endif
-			   )
+			if (USE_VTP)
 			    textcolor((WORD)arg1);
 			else
 			    textattr((WORD)arg1);
@@ -8440,6 +8419,11 @@ vtp_flag_init(void)
 	mode |= (ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
 	if (SetConsoleMode(out, mode) == 0)
 	    vtp_working = 0;
+
+	// VTP uses alternate screen buffer.
+	// But, not if running in a nested terminal
+	use_alternate_screen_buffer = win10_22H2_or_later && p_rs && vtp_working
+						&& !mch_getenv("VIM_TERMINAL");
     }
 #endif
 
@@ -8485,8 +8469,6 @@ vtp_init(void)
     fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
     default_console_color_fg = fg;
 # endif
-    use_alternate_screen_buffer = win10_22H2_or_later && p_rs && vtp_working
-						&& !mch_getenv("VIM_TERMINAL");
     set_console_color_rgb();
 }
 
@@ -8707,6 +8689,9 @@ set_console_color_rgb(void)
 	return;
     }
 
+    if (use_alternate_screen_buffer)
+	return;
+
     fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
     bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
 
@@ -8781,6 +8766,8 @@ get_default_console_color(
 reset_console_color_rgb(void)
 {
 # ifdef FEAT_TERMGUICOLORS
+    if (use_alternate_screen_buffer)
+	return;
 
     CONSOLE_SCREEN_BUFFER_INFOEX csbi;
 
@@ -8803,6 +8790,8 @@ reset_console_color_rgb(void)
 restore_console_color_rgb(void)
 {
 # ifdef FEAT_TERMGUICOLORS
+    if (use_alternate_screen_buffer)
+	return;
 
     CONSOLE_SCREEN_BUFFER_INFOEX csbi;
 
@@ -8875,6 +8864,9 @@ get_conpty_fix_type(void)
     void
 resize_console_buf(void)
 {
+    if (use_alternate_screen_buffer)
+	return;
+
     CONSOLE_SCREEN_BUFFER_INFO csbi;
     COORD coord;
     SMALL_RECT newsize;
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1252,
+/**/
     1251,
 /**/
     1250,