diff options
author | Bram Moolenaar <Bram@vim.org> | 2014-07-30 17:21:58 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2014-07-30 17:21:58 +0200 |
commit | 4e067c898ef1f4a34cd70ddf3de3a1e60ac23c84 (patch) | |
tree | 369d10f3185037c11dd64d8c20292376197fe8d4 /src/term.c | |
parent | b81c85d8f35850ee8f377a2672c506131549f53c (diff) | |
download | vim-git-4e067c898ef1f4a34cd70ddf3de3a1e60ac23c84.tar.gz |
updated for version 7.4.389v7.4.389
Problem: Still sometimes Vim enters Replace mode when starting up.
Solution: Use a different solution in detecting the termresponse and
location response. (Hayaki Saito)
Diffstat (limited to 'src/term.c')
-rw-r--r-- | src/term.c | 136 |
1 files changed, 55 insertions, 81 deletions
diff --git a/src/term.c b/src/term.c index 95c29ccf4..a1ab53729 100644 --- a/src/term.c +++ b/src/term.c @@ -153,11 +153,6 @@ char *UP, *BC, PC; static char_u *vim_tgetstr __ARGS((char *s, char_u **pp)); #endif /* HAVE_TGETENT */ -#if defined(FEAT_TERMRESPONSE) -static int xt_index_in = 0; -static int xt_index_out = 0; -#endif - static int detected_8bit = FALSE; /* detected 8-bit terminal */ static struct builtin_term builtin_termcaps[] = @@ -3312,40 +3307,6 @@ stoptermcap() } #if defined(FEAT_TERMRESPONSE) || defined(PROTO) -# if defined(UNIX) || defined(PROTO) -/* - * Return TRUE when the xterm version was requested or anything else that - * would send an ESC sequence back to Vim. - * If not sent yet, prevent it from being sent soon. - * Used to check whether it is OK to enable checking for DEC mouse codes, - * which conflict with may xterm ESC sequences. - */ - int -did_request_esc_sequence() -{ - if (crv_status == CRV_GET) - crv_status = 0; - if (u7_status == U7_GET) - u7_status = 0; - return crv_status == CRV_SENT || u7_status == U7_SENT - || xt_index_out > xt_index_in; -} - -/* - * If requesting the version was disabled in did_request_esc_sequence(), - * enable it again. - */ - void -resume_get_esc_sequence() -{ - if (crv_status == 0) - crv_status = CRV_GET; - if (u7_status == 0) - u7_status = U7_GET; -} -# endif - - /* * Request version string (for xterm) when needed. * Only do this after switching to raw mode, otherwise the result will be @@ -3358,8 +3319,6 @@ resume_get_esc_sequence() * Insert mode. * On Unix only do it when both output and input are a tty (avoid writing * request to terminal while reading from a file). - * Do not do this when a mouse is being detected that starts with the same ESC - * sequence as the termresponse. * The result is caught in check_termcode(). */ void @@ -3373,7 +3332,6 @@ may_req_termresponse() # ifdef UNIX && isatty(1) && isatty(read_cmd_fd) - && !xterm_conflict_mouse # endif && *T_CRV != NUL) { @@ -3742,8 +3700,8 @@ add_termcode(name, string, flags) #if defined(WIN3264) && !defined(FEAT_GUI) if (s[0] == K_NUL) { - STRMOVE(s + 1, s); - s[1] = 3; + STRMOVE(s + 1, s); + s[1] = 3; } #endif @@ -4212,24 +4170,31 @@ check_termcode(max_offset, buf, bufsize, buflen) #ifdef FEAT_TERMRESPONSE if (key_name[0] == NUL - /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */ + /* Mouse codes of DEC, pterm, and URXVT start with <ESC>[. When + * detecting the start of these mouse codes they might as well be + * another key code or terminal response. */ +# ifdef FEAT_MOUSE_DEC + || key_name[0] == KS_DEC_MOUSE +# endif +# ifdef FEAT_MOUSE_PTERM + || key_name[0] == KS_PTERM_MOUSE +# endif +# ifdef FEAT_MOUSE_URXVT || key_name[0] == KS_URXVT_MOUSE -# ifdef FEAT_MBYTE - || u7_status == U7_SENT # endif - ) + ) { - /* Check for some responses from terminal start with "<Esc>[" or - * CSI. + /* Check for some responses from the terminal starting with + * "<Esc>[" or CSI: * - * - xterm version string: <Esc>[>{x};{vers};{y}c + * - Xterm version string: <Esc>[>{x};{vers};{y}c * Also eat other possible responses to t_RV, rxvt returns * "<Esc>[?1;2c". Also accept CSI instead of <Esc>[. * mrxvt has been reported to have "+" in the version. Assume * the escape sequence ends with a letter or one of "{|}~". * - * - cursor position report: <Esc>[{row};{col}R - * The final byte is 'R'. now it is only used for checking for + * - Cursor position report: <Esc>[{row};{col}R + * The final byte must be 'R'. It is used for checking the * ambiguous-width character state. */ p = tp[0] == CSI ? tp + 1 : tp + 2; @@ -4269,36 +4234,42 @@ check_termcode(max_offset, buf, bufsize, buflen) * u7_status is not "sent", it may be from a previous Vim that * just exited. But not for <S-F3>, it sends something * similar, check for row and column to make sense. */ - if (j == 1 && tp[i] == 'R' && row_char == '2' && col >= 2) + if (j == 1 && tp[i] == 'R') { - char *aw = NULL; + if (row_char == '2' && col >= 2) + { + char *aw = NULL; - LOG_TR("Received U7 status"); - u7_status = U7_GOT; + LOG_TR("Received U7 status"); + u7_status = U7_GOT; # ifdef FEAT_AUTOCMD - did_cursorhold = TRUE; + did_cursorhold = TRUE; # endif - if (col == 2) - aw = "single"; - else if (col == 3) - aw = "double"; - if (aw != NULL && STRCMP(aw, p_ambw) != 0) - { - /* Setting the option causes a screen redraw. Do that - * right away if possible, keeping any messages. */ - set_option_value((char_u *)"ambw", 0L, (char_u *)aw, 0); -# ifdef DEBUG_TERMRESPONSE + if (col == 2) + aw = "single"; + else if (col == 3) + aw = "double"; + if (aw != NULL && STRCMP(aw, p_ambw) != 0) { - char buf[100]; - int r = redraw_asap(CLEAR); + /* Setting the option causes a screen redraw. Do + * that right away if possible, keeping any + * messages. */ + set_option_value((char_u *)"ambw", 0L, + (char_u *)aw, 0); +# ifdef DEBUG_TERMRESPONSE + { + char buf[100]; + int r = redraw_asap(CLEAR); - sprintf(buf, "set 'ambiwidth', redraw_asap(): %d", - r); - log_tr(buf); - } + sprintf(buf, + "set 'ambiwidth', redraw_asap(): %d", + r); + log_tr(buf); + } # else - redraw_asap(CLEAR); + redraw_asap(CLEAR); # endif + } } key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; @@ -4563,19 +4534,19 @@ check_termcode(max_offset, buf, bufsize, buflen) return -1; /* when mouse reporting is SGR, add 32 to mouse code */ - if (key_name[0] == KS_SGR_MOUSE) - mouse_code += 32; + if (key_name[0] == KS_SGR_MOUSE) + mouse_code += 32; mouse_col = getdigits(&p) - 1; if (*p++ != ';') return -1; mouse_row = getdigits(&p) - 1; - if (key_name[0] == KS_SGR_MOUSE && *p == 'm') + if (key_name[0] == KS_SGR_MOUSE && *p == 'm') mouse_code |= MOUSE_RELEASE; - else if (*p != 'M') + else if (*p != 'M') return -1; - p++; + p++; slen += (int)(p - (tp + slen)); @@ -4592,7 +4563,7 @@ check_termcode(max_offset, buf, bufsize, buflen) for (slen2 = slen; slen2 < len; slen2++) { if (tp[slen2] == 'M' - || (key_name[0] == KS_SGR_MOUSE + || (key_name[0] == KS_SGR_MOUSE && tp[slen2] == 'm')) { cmd_complete = 1; @@ -5769,6 +5740,9 @@ show_one_termcode(name, code, printit) * termcap codes from the terminal itself. * We get them one by one to avoid a very long response string. */ +static int xt_index_in = 0; +static int xt_index_out = 0; + static void req_codes_from_term() { |