From f3af54eeb1575618b866aa837e7aca7665aca196 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 30 Aug 2017 14:53:06 +0200 Subject: patch 8.0.1016: gnome terminal echoes t_RC Problem: Gnome terminal echoes t_RC. Solution: Detect Gnome terminal by the version string. Add v: variables for all the term responses. --- runtime/doc/eval.txt | 20 ++++++++++++++ src/eval.c | 4 +++ src/term.c | 73 +++++++++++++++++++++++++++++++--------------------- src/version.c | 2 ++ src/vim.h | 6 ++++- 5 files changed, 74 insertions(+), 31 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 7205c89a8..a75d4f680 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1902,6 +1902,26 @@ v:termresponse The escape sequence returned by the terminal for the |t_RV| always 95 or bigger). Pc is always zero. {only when compiled with |+termresponse| feature} + *v:termblinkresp* +v:termblinkresp The escape sequence returned by the terminal for the |t_RC| + termcap entry. This is used to find out whether the terminal + cursor is blinking. This is used by |term_getcursor()|. + + *v:termstyleresp* +v:termstyleresp The escape sequence returned by the terminal for the |t_RS| + termcap entry. This is used to find out what the shape of the + cursor is. This is used by |term_getcursor()|. + + *v:termrgbresp* +v:termrgbresp The escape sequence returned by the terminal for the |t_RB| + termcap entry. This is used to find out what the terminal + background color is, see 'background'. + + *v:termu7resp* +v:termu7resp The escape sequence returned by the terminal for the |t_u7| + termcap entry. This is used to find out what the terminal + does with ambiguous width characters, see 'ambiwidth'. + *v:testing* *testing-variable* v:testing Must be set before using `test_garbagecollect_now()`. Also, when set certain error messages won't be shown for 2 diff --git a/src/eval.c b/src/eval.c index b8e606443..b4250de17 100644 --- a/src/eval.c +++ b/src/eval.c @@ -187,6 +187,10 @@ static struct vimvar {VV_NAME("t_none", VAR_NUMBER), VV_RO}, {VV_NAME("t_job", VAR_NUMBER), VV_RO}, {VV_NAME("t_channel", VAR_NUMBER), VV_RO}, + {VV_NAME("termrgbresp", VAR_STRING), VV_RO}, + {VV_NAME("termu7resp", VAR_STRING), VV_RO}, + {VV_NAME("termstyleresp", VAR_STRING), VV_RO}, + {VV_NAME("termblinkresp", VAR_STRING), VV_RO}, }; /* shorthand */ diff --git a/src/term.c b/src/term.c index fdae4ea08..faf3762fb 100644 --- a/src/term.c +++ b/src/term.c @@ -1369,9 +1369,7 @@ static int need_gather = FALSE; /* need to fill termleader[] */ static char_u termleader[256 + 1]; /* for check_termcode() */ #ifdef FEAT_TERMRESPONSE static int check_for_codes = FALSE; /* check for key code response */ -# ifdef MACOS -static int is_terminal_app = FALSE; /* recognized Terminal.app */ -# endif +static int is_not_xterm = FALSE; /* recognized not-really-xterm */ #endif static struct builtin_term * @@ -3506,13 +3504,10 @@ may_req_ambiguous_char_width(void) /* * Similar to requesting the version string: Request the terminal background * color when it is the right moment. - * Also request the cursor shape, if possible. */ void may_req_bg_color(void) { - int did_one = FALSE; - if (can_get_termresponse() && starting == 0) { /* Only request background if t_RB is set and 'background' wasn't @@ -3524,20 +3519,7 @@ may_req_bg_color(void) LOG_TR("Sending BG request"); out_str(T_RBG); rbg_status = STATUS_SENT; - did_one = TRUE; - } - - /* Only request cursor blinking mode if t_RC is set. */ - if (rbm_status == STATUS_GET && *T_CRC != NUL) - { - LOG_TR("Sending BC request"); - out_str(T_CRC); - rbm_status = STATUS_SENT; - did_one = TRUE; - } - if (did_one) - { /* check for the characters now, otherwise they might be eaten by * get_keystroke() */ out_flush(); @@ -4505,6 +4487,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMU7RESP, tp, slen); +# endif } else #endif @@ -4530,6 +4515,8 @@ check_termcode( if (tp[1 + (tp[0] != CSI)] == '>' && semicols == 2) { + int need_flush = FALSE; + /* Only set 'ttymouse' automatically if it was not set * by the user already. */ if (!option_was_set((char_u *)"ttym")) @@ -4566,35 +4553,53 @@ check_termcode( may_adjust_color_count(256); } + /* Detect terminals that set $TERM to something like + * "xterm-256colors" but are not fully xterm + * compatible. */ # ifdef MACOS /* Mac Terminal.app sends 1;95;0 */ if (col == 95 && STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0) - { - /* Terminal.app sets $TERM to "xterm-256colors", - * but it's not fully xterm compatible. */ - is_terminal_app = TRUE; - } + is_not_xterm = TRUE; # endif + /* Gnome Terminal.app sends 1;4402;0, assuming any + * version number over 4000 is not an xterm. */ + if (col >= 4000) + is_not_xterm = TRUE; /* Only request the cursor style if t_SH and t_RS are * set. Not for Terminal.app, it can't handle t_RS, it * echoes the characters to the screen. */ if (rcs_status == STATUS_GET -# ifdef MACOS - && !is_terminal_app -# endif + && !is_not_xterm && *T_CSH != NUL && *T_CRS != NUL) { LOG_TR("Sending cursor style request"); out_str(T_CRS); rcs_status = STATUS_SENT; - out_flush(); + need_flush = TRUE; } + + /* Only request the cursor blink mode if t_RC set. Not + * for Gnome terminal, it can't handle t_RC, it + * echoes the characters to the screen. */ + if (rbm_status == STATUS_GET + && !is_not_xterm + && *T_CRC != NUL) + { + LOG_TR("Sending cursor blink mode request"); + out_str(T_CRC); + rbm_status = STATUS_SENT; + need_flush = TRUE; + } + + if (need_flush) + out_flush(); } + slen = i + 1; # ifdef FEAT_EVAL - set_vim_var_string(VV_TERMRESPONSE, tp, i + 1); + set_vim_var_string(VV_TERMRESPONSE, tp, slen); # endif # ifdef FEAT_AUTOCMD apply_autocmds(EVENT_TERMRESPONSE, @@ -4602,7 +4607,6 @@ check_termcode( # endif key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; - slen = i + 1; } /* Check blinking cursor from xterm: @@ -4626,6 +4630,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMBLINKRESP, tp, slen); +# endif } /* @@ -4714,6 +4721,9 @@ check_termcode( /* Sometimes the 0x07 is followed by 0x18, unclear * when this happens. */ ++slen; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMRGBRESP, tp, slen); +# endif break; } if (i == len) @@ -4788,6 +4798,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1 + (tp[i] == ESC); +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMSTYLERESP, tp, slen); +# endif } } diff --git a/src/version.c b/src/version.c index 8af0c0d2e..8ffd164d9 100644 --- a/src/version.c +++ b/src/version.c @@ -769,6 +769,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1016, /**/ 1015, /**/ diff --git a/src/vim.h b/src/vim.h index 991c1b78a..7fea70b90 100644 --- a/src/vim.h +++ b/src/vim.h @@ -2012,7 +2012,11 @@ typedef int sock_T; #define VV_TYPE_NONE 78 #define VV_TYPE_JOB 79 #define VV_TYPE_CHANNEL 80 -#define VV_LEN 81 /* number of v: vars */ +#define VV_TERMRGBRESP 81 +#define VV_TERMU7RESP 82 +#define VV_TERMSTYLERESP 83 +#define VV_TERMBLINKRESP 84 +#define VV_LEN 85 /* number of v: vars */ /* used for v_number in VAR_SPECIAL */ #define VVAL_FALSE 0L -- cgit v1.2.1