0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.0.0748: running Vim in terminal window doesn't use the right colors

Problem:    When running Vim in a terminal window it does not detect the right
            number of colors available.
Solution:   Detect the version string that libvterm returns.  Pass the number
            of colors in $COLORS.
This commit is contained in:
Bram Moolenaar
2017-07-22 20:33:05 +02:00
parent e173fd0972
commit b7a8dfeb49
3 changed files with 72 additions and 33 deletions

View File

@@ -4063,7 +4063,13 @@ set_child_environment(long rows, long columns, char *term)
static char envbuf_Rows[20]; static char envbuf_Rows[20];
static char envbuf_Lines[20]; static char envbuf_Lines[20];
static char envbuf_Columns[20]; static char envbuf_Columns[20];
static char envbuf_Colors[20];
# endif # endif
long colors =
# ifdef FEAT_GUI
gui.in_use ? 256*256*256 :
# endif
t_colors;
/* Simulate to have a dumb terminal (for now) */ /* Simulate to have a dumb terminal (for now) */
# ifdef HAVE_SETENV # ifdef HAVE_SETENV
@@ -4074,6 +4080,8 @@ set_child_environment(long rows, long columns, char *term)
setenv("LINES", (char *)envbuf, 1); setenv("LINES", (char *)envbuf, 1);
sprintf((char *)envbuf, "%ld", columns); sprintf((char *)envbuf, "%ld", columns);
setenv("COLUMNS", (char *)envbuf, 1); setenv("COLUMNS", (char *)envbuf, 1);
sprintf((char *)envbuf, "%ld", colors);
setenv("COLORS", (char *)envbuf, 1);
# else # else
/* /*
* Putenv does not copy the string, it has to remain valid. * Putenv does not copy the string, it has to remain valid.
@@ -4088,6 +4096,8 @@ set_child_environment(long rows, long columns, char *term)
vim_snprintf(envbuf_Columns, sizeof(envbuf_Columns), vim_snprintf(envbuf_Columns, sizeof(envbuf_Columns),
"COLUMNS=%ld", columns); "COLUMNS=%ld", columns);
putenv(envbuf_Columns); putenv(envbuf_Columns);
vim_snprintf(envbuf_Colors, sizeof(envbuf_Colors), "COLORS=%ld", colors);
putenv(envbuf_Colors);
# endif # endif
} }

View File

@@ -1428,8 +1428,6 @@ parse_builtin_tcap(char_u *term)
} }
} }
#if defined(HAVE_TGETENT) || defined(FEAT_TERMRESPONSE) #if defined(HAVE_TGETENT) || defined(FEAT_TERMRESPONSE)
static void set_color_count(int nr);
/* /*
* Set number of colors. * Set number of colors.
* Store it as a number in t_colors. * Store it as a number in t_colors.
@@ -1447,6 +1445,35 @@ set_color_count(int nr)
*nr_colors = NUL; *nr_colors = NUL;
set_string_option_direct((char_u *)"t_Co", -1, nr_colors, OPT_FREE, 0); set_string_option_direct((char_u *)"t_Co", -1, nr_colors, OPT_FREE, 0);
} }
/*
* Set the color count to "val" and redraw if it changed.
*/
static void
may_adjust_color_count(int val)
{
if (val != t_colors)
{
/* Nr of colors changed, initialize highlighting and
* redraw everything. This causes a redraw, which usually
* clears the message. Try keeping the message if it
* might work. */
set_keep_msg_from_hist();
set_color_count(val);
init_highlight(TRUE, FALSE);
# ifdef DEBUG_TERMRESPONSE
{
char buf[100];
int r = redraw_asap(CLEAR);
sprintf(buf, "Received t_Co, redraw_asap(): %d", r);
log_tr(buf);
}
# else
redraw_asap(CLEAR);
# endif
}
}
#endif #endif
#ifdef HAVE_TGETENT #ifdef HAVE_TGETENT
@@ -2713,9 +2740,9 @@ term_get_winpos(int *x, int *y)
# endif # endif
void void
term_set_winsize(int width, int height) term_set_winsize(int height, int width)
{ {
OUT_STR(tgoto((char *)T_CWS, height, width)); OUT_STR(tgoto((char *)T_CWS, width, height));
} }
#endif #endif
@@ -2823,6 +2850,8 @@ term_settitle(char_u *title)
void void
ttest(int pairs) ttest(int pairs)
{ {
char_u *env_colors;
check_options(); /* make sure no options are NULL */ check_options(); /* make sure no options are NULL */
/* /*
@@ -2909,8 +2938,16 @@ ttest(int pairs)
} }
need_gather = TRUE; need_gather = TRUE;
/* Set t_colors to the value of t_Co. */ /* Set t_colors to the value of $COLORS or t_Co. */
t_colors = atoi((char *)T_CCO); t_colors = atoi((char *)T_CCO);
env_colors = mch_getenv((char_u *)"COLORS");
if (env_colors != NULL && isdigit(*env_colors))
{
int colors = atoi((char *)env_colors);
if (colors != t_colors)
set_color_count(colors);
}
} }
#if (defined(FEAT_GUI) && (defined(FEAT_MENU) || !defined(USE_ON_FLY_SCROLL))) \ #if (defined(FEAT_GUI) && (defined(FEAT_MENU) || !defined(USE_ON_FLY_SCROLL))) \
@@ -4250,6 +4287,7 @@ check_termcode(
* "<Esc>[" or CSI: * "<Esc>[" or CSI:
* *
* - Xterm version string: <Esc>[>{x};{vers};{y}c * - Xterm version string: <Esc>[>{x};{vers};{y}c
* Libvterm returns {x} == 0, {vers} == 100, {y} == 0.
* Also eat other possible responses to t_RV, rxvt returns * Also eat other possible responses to t_RV, rxvt returns
* "<Esc>[?1;2c". Also accept CSI instead of <Esc>[. * "<Esc>[?1;2c". Also accept CSI instead of <Esc>[.
* mrxvt has been reported to have "+" in the version. Assume * mrxvt has been reported to have "+" in the version. Assume
@@ -4359,10 +4397,8 @@ check_termcode(
/* rxvt sends its version number: "20703" is 2.7.3. /* rxvt sends its version number: "20703" is 2.7.3.
* Ignore it for when the user has set 'term' to xterm, * Ignore it for when the user has set 'term' to xterm,
* even though it's an rxvt. */ * even though it's an rxvt. */
if (extra > 0) if (col > 20000)
extra = atoi((char *)tp + extra); col = 0;
if (extra > 20000)
extra = 0;
if (tp[1 + (tp[0] != CSI)] == '>' && j == 2) if (tp[1 + (tp[0] != CSI)] == '>' && j == 2)
{ {
@@ -4371,25 +4407,36 @@ check_termcode(
if (!option_was_set((char_u *)"ttym")) if (!option_was_set((char_u *)"ttym"))
{ {
# ifdef TTYM_SGR # ifdef TTYM_SGR
if (extra >= 277) if (col >= 277)
set_option_value((char_u *)"ttym", 0L, set_option_value((char_u *)"ttym", 0L,
(char_u *)"sgr", 0); (char_u *)"sgr", 0);
else else
# endif # endif
/* if xterm version >= 95 use mouse dragging */ /* if xterm version >= 95 use mouse dragging */
if (extra >= 95) if (col >= 95)
set_option_value((char_u *)"ttym", 0L, set_option_value((char_u *)"ttym", 0L,
(char_u *)"xterm2", 0); (char_u *)"xterm2", 0);
} }
/* if xterm version >= 141 try to get termcap codes */ /* if xterm version >= 141 try to get termcap codes */
if (extra >= 141) if (col >= 141)
{ {
LOG_TR("Enable checking for XT codes"); LOG_TR("Enable checking for XT codes");
check_for_codes = TRUE; check_for_codes = TRUE;
need_gather = TRUE; need_gather = TRUE;
req_codes_from_term(); req_codes_from_term();
} }
/* libvterm sends 0;100;0 */
if (col == 100
&& STRNCMP(tp + extra - 2, ">0;100;0c", 9) == 0)
{
/* If run from Vim $COLORS is set to the number of
* colors the terminal supports. Otherwise assume
* 256, libvterm supports even more. */
if (mch_getenv((char_u *)"COLORS") == NULL)
may_adjust_color_count(256);
}
} }
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
set_vim_var_string(VV_TERMRESPONSE, tp, i + 1); set_vim_var_string(VV_TERMRESPONSE, tp, i + 1);
@@ -5993,27 +6040,7 @@ got_code_from_term(char_u *code, int len)
{ {
/* Color count is not a key code. */ /* Color count is not a key code. */
i = atoi((char *)str); i = atoi((char *)str);
if (i != t_colors) may_adjust_color_count(i);
{
/* Nr of colors changed, initialize highlighting and
* redraw everything. This causes a redraw, which usually
* clears the message. Try keeping the message if it
* might work. */
set_keep_msg_from_hist();
set_color_count(i);
init_highlight(TRUE, FALSE);
#ifdef DEBUG_TERMRESPONSE
{
char buf[100];
int r = redraw_asap(CLEAR);
sprintf(buf, "Received t_Co, redraw_asap(): %d", r);
log_tr(buf);
}
#else
redraw_asap(CLEAR);
#endif
}
} }
else else
{ {

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
748,
/**/ /**/
747, 747,
/**/ /**/