diff options
author | Christopher Plewright <chris@createng.com> | 2023-01-22 18:58:30 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-01-22 18:58:30 +0000 |
commit | d343c60df4b0adc6b1baac4d68a72a735ac21dc4 (patch) | |
tree | 1aff83fff0999c85ef078e94abf54df137e3ec19 | |
parent | 3770f4c9cde7b5fcd10b6fa2e665cd0b69450fb2 (diff) | |
download | vim-git-d343c60df4b0adc6b1baac4d68a72a735ac21dc4.tar.gz |
patch 9.0.1232: ColorTable saving and restoring does not work properlyv9.0.1232
Problem: ColorTable saving and restoring does not work properly.
Solution: Restore ColorTable[16] usage. (Christopher Plewright,
closes #11836)
-rw-r--r-- | src/os_win32.c | 113 | ||||
-rw-r--r-- | src/proto/os_win32.pro | 1 | ||||
-rw-r--r-- | src/term.c | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 51 insertions, 67 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 8a254f8a1..ba5d228b8 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -3426,7 +3426,6 @@ mch_init_c(void) wt_init(); vtp_flag_init(); - vtp_init(); # ifdef FEAT_RESTORE_ORIG_SCREEN // Save the initial console buffer for later restoration SaveConsoleBuffer(&g_cbOrig); @@ -3463,6 +3462,8 @@ mch_init_c(void) ui_get_shellsize(); + vtp_init(); + # ifdef MCH_WRITE_DUMP fdDump = fopen("dump", "wt"); @@ -8456,26 +8457,23 @@ vtp_flag_init(void) vtp_init(void) { # ifdef FEAT_TERMGUICOLORS - if (!vtp_working) - { - CONSOLE_SCREEN_BUFFER_INFOEX csbi; - csbi.cbSize = sizeof(csbi); - GetConsoleScreenBufferInfoEx(g_hConOut, &csbi); - save_console_bg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_bg]; - save_console_fg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_fg]; - store_console_bg_rgb = save_console_bg_rgb; - store_console_fg_rgb = save_console_fg_rgb; - - COLORREF bg; - bg = (COLORREF)csbi.ColorTable[g_color_index_bg]; - bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); - default_console_color_bg = bg; - - COLORREF fg; - fg = (COLORREF)csbi.ColorTable[g_color_index_fg]; - fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); - default_console_color_fg = fg; - } + CONSOLE_SCREEN_BUFFER_INFOEX csbi; + csbi.cbSize = sizeof(csbi); + GetConsoleScreenBufferInfoEx(g_hConOut, &csbi); + save_console_bg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_bg]; + save_console_fg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_fg]; + store_console_bg_rgb = save_console_bg_rgb; + store_console_fg_rgb = save_console_fg_rgb; + + COLORREF bg; + bg = (COLORREF)csbi.ColorTable[g_color_index_bg]; + bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); + default_console_color_bg = bg; + + COLORREF fg; + fg = (COLORREF)csbi.ColorTable[g_color_index_fg]; + 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"); @@ -8667,6 +8665,12 @@ wt_init(void) wt_working = mch_getenv("WT_SESSION") != NULL; } + int +use_wt(void) +{ + return USE_WT; +} + # ifdef FEAT_TERMGUICOLORS static int ctermtoxterm( @@ -8699,23 +8703,20 @@ set_console_color_rgb(void) return; } - if (!conpty_working) - { - fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); - bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); + fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); + bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); - csbi.cbSize = sizeof(csbi); - GetConsoleScreenBufferInfoEx(g_hConOut, &csbi); + csbi.cbSize = sizeof(csbi); + GetConsoleScreenBufferInfoEx(g_hConOut, &csbi); - csbi.cbSize = sizeof(csbi); - csbi.srWindow.Right += 1; - csbi.srWindow.Bottom += 1; - store_console_bg_rgb = csbi.ColorTable[g_color_index_bg]; - store_console_fg_rgb = csbi.ColorTable[g_color_index_fg]; - csbi.ColorTable[g_color_index_bg] = (COLORREF)bg; - csbi.ColorTable[g_color_index_fg] = (COLORREF)fg; - SetConsoleScreenBufferInfoEx(g_hConOut, &csbi); - } + csbi.cbSize = sizeof(csbi); + csbi.srWindow.Right += 1; + csbi.srWindow.Bottom += 1; + store_console_bg_rgb = csbi.ColorTable[g_color_index_bg]; + store_console_fg_rgb = csbi.ColorTable[g_color_index_fg]; + csbi.ColorTable[g_color_index_bg] = (COLORREF)bg; + csbi.ColorTable[g_color_index_fg] = (COLORREF)fg; + SetConsoleScreenBufferInfoEx(g_hConOut, &csbi); # endif } @@ -8742,39 +8743,24 @@ get_default_console_color( ctermfg = -1; if (id > 0) syn_id2cterm_bg(id, &ctermfg, &dummynull); - if (vtp_working) - { - cterm_normal_fg_gui_color = guifg = - ctermfg != -1 ? ctermtoxterm(ctermfg) : INVALCOLOR; - ctermfg = ctermfg < 0 ? 0 : ctermfg; - } + if (ctermfg != -1) + guifg = ctermtoxterm(ctermfg); else - { - guifg = ctermfg != -1 ? ctermtoxterm(ctermfg) - : default_console_color_fg; - cterm_normal_fg_gui_color = guifg; - ctermfg = ctermfg < 0 ? 0 : ctermfg; - } + guifg = USE_WT ? INVALCOLOR : default_console_color_fg; + cterm_normal_fg_gui_color = guifg; + ctermfg = ctermfg < 0 ? 0 : ctermfg; } if (guibg == INVALCOLOR) { ctermbg = -1; if (id > 0) syn_id2cterm_bg(id, &dummynull, &ctermbg); - if (vtp_working) - { - cterm_normal_bg_gui_color = guibg = - ctermbg != -1 ? ctermtoxterm(ctermbg) : INVALCOLOR; - if (ctermbg < 0) - ctermbg = 0; - } + if (ctermbg != -1) + guibg = ctermtoxterm(ctermbg); else - { - guibg = ctermbg != -1 ? ctermtoxterm(ctermbg) - : default_console_color_bg; - cterm_normal_bg_gui_color = guibg; - ctermbg = ctermbg < 0 ? 0 : ctermbg; - } + guibg = USE_WT ? INVALCOLOR : default_console_color_bg; + cterm_normal_bg_gui_color = guibg; + ctermbg = ctermbg < 0 ? 0 : ctermbg; } *cterm_fg = ctermfg; @@ -8792,9 +8778,6 @@ reset_console_color_rgb(void) { # ifdef FEAT_TERMGUICOLORS - if (vtp_working) - return; - CONSOLE_SCREEN_BUFFER_INFOEX csbi; csbi.cbSize = sizeof(csbi); @@ -8816,8 +8799,6 @@ reset_console_color_rgb(void) restore_console_color_rgb(void) { # ifdef FEAT_TERMGUICOLORS - if (vtp_working) - return; CONSOLE_SCREEN_BUFFER_INFOEX csbi; diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro index 9f8b96958..6673c7878 100644 --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -73,6 +73,7 @@ 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); diff --git a/src/term.c b/src/term.c index ab42afb0a..54da3d7f8 100644 --- a/src/term.c +++ b/src/term.c @@ -3222,7 +3222,7 @@ term_rgb_color(char_u *s, guicolor_T rgb) vim_snprintf(buf, MAX_COLOR_STR_LEN, (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb)); #ifdef FEAT_VTP - if (has_vtp_working()) + if (use_wt()) { out_flush(); buf[1] = '['; diff --git a/src/version.c b/src/version.c index 0d595db8e..6604e0164 100644 --- 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 */ /**/ + 1232, +/**/ 1231, /**/ 1230, |