To: vim_dev@googlegroups.com Subject: Patch 8.2.0848 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0848 Problem: MS-Windows: the Windows terminal code has some flaws. Solution: Do not redraw the right edge of the screen. Remove the background color trick. Flush the screen output buffer often. (Nobuhiro Takasaki, #5546) Files: src/os_win32.c, src/proto/os_win32.pro, src/term.c *** ../vim-8.2.0847/src/os_win32.c 2020-05-18 20:16:56.617319687 +0200 --- src/os_win32.c 2020-05-30 17:41:51.112819617 +0200 *************** *** 195,204 **** static int vtp_working = 0; static void vtp_init(); static void vtp_exit(); - static int vtp_printf(char *format, ...); static void vtp_sgr_bulk(int arg); static void vtp_sgr_bulks(int argc, int *argv); static guicolor_T save_console_bg_rgb; static guicolor_T save_console_fg_rgb; static guicolor_T store_console_bg_rgb; --- 195,206 ---- static int vtp_working = 0; static void vtp_init(); static void vtp_exit(); static void vtp_sgr_bulk(int arg); static void vtp_sgr_bulks(int argc, int *argv); + static int wt_working = 0; + static void wt_init(); + static guicolor_T save_console_bg_rgb; static guicolor_T save_console_fg_rgb; static guicolor_T store_console_bg_rgb; *************** *** 214,221 **** --- 216,225 ---- # ifdef FEAT_TERMGUICOLORS # define USE_VTP (vtp_working && is_term_win32() && (p_tgc || (!p_tgc && t_colors >= 256))) + # define USE_WT (wt_working) # else # define USE_VTP 0 + # define USE_WT 0 # endif static void set_console_color_rgb(void); *************** *** 236,241 **** --- 240,251 ---- static BOOL win8_or_later = FALSE; + # if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__CYGWIN__) + # define UChar UnicodeChar + # else + # define UChar uChar.UnicodeChar + # endif + #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) // Dynamic loading for portability typedef struct _DYN_CONSOLE_SCREEN_BUFFER_INFOEX *************** *** 286,291 **** --- 296,325 ---- } #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) + static BOOL + is_ambiwidth_event( + INPUT_RECORD *ir) + { + return ir->EventType == KEY_EVENT + && ir->Event.KeyEvent.bKeyDown + && ir->Event.KeyEvent.wRepeatCount == 1 + && ir->Event.KeyEvent.wVirtualKeyCode == 0x12 + && ir->Event.KeyEvent.wVirtualScanCode == 0x38 + && ir->Event.KeyEvent.UChar == 0 + && ir->Event.KeyEvent.dwControlKeyState == 2; + } + + static void + make_ambiwidth_event( + INPUT_RECORD *down, + INPUT_RECORD *up) + { + down->Event.KeyEvent.wVirtualKeyCode = 0; + down->Event.KeyEvent.wVirtualScanCode = 0; + down->Event.KeyEvent.UChar = up->Event.KeyEvent.UChar; + down->Event.KeyEvent.dwControlKeyState = 0; + } + /* * Version of ReadConsoleInput() that works with IME. * Works around problems on Windows 8. *************** *** 322,331 **** if (s_dwMax == 0) { ! if (nLength == -1) return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents); ! if (!ReadConsoleInputW(hInput, s_irCache, IRSIZE, &dwEvents)) ! return FALSE; s_dwIndex = 0; s_dwMax = dwEvents; if (dwEvents == 0) --- 356,367 ---- if (s_dwMax == 0) { ! if (!USE_WT && nLength == -1) return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents); ! GetNumberOfConsoleInputEvents(hInput, &dwEvents); ! if (dwEvents == 0 && nLength == -1) ! return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents); ! ReadConsoleInputW(hInput, s_irCache, IRSIZE, &dwEvents); s_dwIndex = 0; s_dwMax = dwEvents; if (dwEvents == 0) *************** *** 334,339 **** --- 370,379 ---- return TRUE; } + for (i = s_dwIndex; i < (int)s_dwMax - 1; ++i) + if (is_ambiwidth_event(&s_irCache[i])) + make_ambiwidth_event(&s_irCache[i], &s_irCache[i + 1]); + if (s_dwMax > 1) { head = 0; *************** *** 937,948 **** }; - # if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__CYGWIN__) - # define UChar UnicodeChar - # else - # define UChar uChar.UnicodeChar - # endif - /* * The return code indicates key code size. */ --- 977,982 ---- *************** *** 2689,2694 **** --- 2723,2729 ---- vtp_flag_init(); vtp_init(); + wt_init(); } /* *************** *** 5781,5786 **** --- 5816,5834 ---- clear_chars(coord, source.Right - source.Left + 1); } } + + if (USE_WT) + { + COORD coord; + int i; + + coord.X = source.Left; + for (i = source.Top; i < dest.Y; ++i) + { + coord.Y = i; + clear_chars(coord, source.Right - source.Left + 1); + } + } } *************** *** 5837,5842 **** --- 5885,5903 ---- clear_chars(coord, source.Right - source.Left + 1); } } + + if (USE_WT) + { + COORD coord; + int i; + + coord.X = source.Left; + for (i = nb; i <= source.Bottom; ++i) + { + coord.Y = i; + clear_chars(coord, source.Right - source.Left + 1); + } + } } *************** *** 7587,7593 **** restore_console_color_rgb(); } ! static int vtp_printf( char *format, ...) --- 7648,7654 ---- restore_console_color_rgb(); } ! int vtp_printf( char *format, ...) *************** *** 7760,7765 **** --- 7821,7838 ---- } } + static void + wt_init(void) + { + wt_working = (mch_getenv("WT_SESSION") != NULL); + } + + int + use_wt(void) + { + return USE_WT; + } + # ifdef FEAT_TERMGUICOLORS static int ctermtoxterm( *************** *** 7785,7790 **** --- 7858,7870 ---- get_default_console_color(&ctermfg, &ctermbg, &fg, &bg); + if (USE_WT) + { + term_fg_rgb_color(fg); + term_bg_rgb_color(bg); + return; + } + fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); *************** *** 7858,7863 **** --- 7938,7946 ---- # ifdef FEAT_TERMGUICOLORS DYN_CONSOLE_SCREEN_BUFFER_INFOEX csbi; + if (USE_WT) + return; + csbi.cbSize = sizeof(csbi); if (has_csbiex) pGetConsoleScreenBufferInfoEx(g_hConOut, &csbi); *** ../vim-8.2.0847/src/proto/os_win32.pro 2020-05-17 14:06:07.317201551 +0200 --- src/proto/os_win32.pro 2020-05-30 17:41:51.112819617 +0200 *************** *** 71,76 **** --- 71,78 ---- void set_alist_count(void); void fix_arg_enc(void); int mch_setenv(char *var, char *value, int x); + int vtp_printf(char *format, ...); + int use_wt(void); void get_default_console_color(int *cterm_fg, int *cterm_bg, guicolor_T *gui_fg, guicolor_T *gui_bg); void control_console_color_rgb(void); int use_vtp(void); *** ../vim-8.2.0847/src/term.c 2020-05-24 17:23:41.834154785 +0200 --- src/term.c 2020-05-30 17:41:51.112819617 +0200 *************** *** 2956,2962 **** vim_snprintf(buf, MAX_COLOR_STR_LEN, (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb)); ! OUT_STR(buf); } void --- 2956,2971 ---- vim_snprintf(buf, MAX_COLOR_STR_LEN, (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb)); ! #ifdef FEAT_VTP ! if (use_wt()) ! { ! out_flush(); ! buf[1] = '['; ! vtp_printf(buf); ! } ! else ! #endif ! OUT_STR(buf); } void *** ../vim-8.2.0847/src/version.c 2020-05-30 17:05:57.032692393 +0200 --- src/version.c 2020-05-30 17:48:57.627230629 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 848, /**/ -- I noticed my daughter's Disney-net password on a sticky note: "MickeyMinnieGoofyPluto". I asked her why it was so long. "Because they say it has to have at least four characters." /// 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 ///