# HG changeset patch # User Bram Moolenaar # Date 1406733718 -7200 # Node ID 3d206df5c8284f7d5f4a987ae9c7a508f289f008 # Parent d59994b0d90c4f8a002f5285899b17ed24fb28e9 updated for version 7.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) diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1336,9 +1336,6 @@ EXTERN HWND clientWindow INIT(= 0); #if defined(UNIX) || defined(VMS) EXTERN int term_is_xterm INIT(= FALSE); /* xterm-like 'term' */ #endif -#if defined(UNIX) -EXTERN int xterm_conflict_mouse INIT(= FALSE); -#endif #ifdef BACKSLASH_IN_FILENAME EXTERN char psepc INIT(= '\\'); /* normal path separator character */ diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3667,8 +3667,6 @@ mch_setmouse(on) void check_mouse_termcode() { - xterm_conflict_mouse = FALSE; - # ifdef FEAT_MOUSE_XTERM if (use_xterm_mouse() # ifdef FEAT_MOUSE_URXVT @@ -3713,7 +3711,7 @@ check_mouse_termcode() # endif # ifdef FEAT_MOUSE_JSB - /* There is no conflict, but it was disabled for xterm before. */ + /* Conflicts with xterm mouse: "\033[" and "\033[M" ??? */ if (!use_xterm_mouse() # ifdef FEAT_GUI && !gui.in_use @@ -3740,45 +3738,31 @@ check_mouse_termcode() # endif # ifdef FEAT_MOUSE_DEC - /* Conflicts with xterm mouse: "\033[" and "\033[M". - * Also conflicts with the xterm termresponse, skip this if it was - * requested already. */ + /* Conflicts with xterm mouse: "\033[" and "\033[M" */ if (!use_xterm_mouse() -# ifdef FEAT_TERMRESPONSE - && !did_request_esc_sequence() -# endif # ifdef FEAT_GUI && !gui.in_use # endif ) - { set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME) ? IF_EB("\233", CSI_STR) : IF_EB("\033[", ESC_STR "["))); - xterm_conflict_mouse = TRUE; - } else del_mouse_termcode(KS_DEC_MOUSE); # endif # ifdef FEAT_MOUSE_PTERM - /* same as the dec mouse */ + /* same conflict as the dec mouse */ if (!use_xterm_mouse() -# ifdef FEAT_TERMRESPONSE - && !did_request_esc_sequence() -# endif # ifdef FEAT_GUI && !gui.in_use # endif ) - { set_mouse_termcode(KS_PTERM_MOUSE, (char_u *) IF_EB("\033[", ESC_STR "[")); - xterm_conflict_mouse = TRUE; - } else del_mouse_termcode(KS_PTERM_MOUSE); # endif # ifdef FEAT_MOUSE_URXVT - /* same as the dec mouse */ + /* same conflict as the dec mouse */ if (use_xterm_mouse() == 3 # ifdef FEAT_GUI && !gui.in_use @@ -3794,8 +3778,6 @@ check_mouse_termcode() mch_setmouse(FALSE); setmouse(); } - /* It's OK to request the xterm version for uxterm. */ - resume_get_esc_sequence(); } else del_mouse_termcode(KS_URXVT_MOUSE); diff --git a/src/proto/term.pro b/src/proto/term.pro --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -34,8 +34,6 @@ void set_shellsize __ARGS((int width, in void settmode __ARGS((int tmode)); void starttermcap __ARGS((void)); void stoptermcap __ARGS((void)); -int did_request_esc_sequence __ARGS((void)); -void resume_get_esc_sequence __ARGS((void)); void may_req_termresponse __ARGS((void)); void may_req_ambiguous_char_width __ARGS((void)); int swapping_screen __ARGS((void)); diff --git a/src/term.c b/src/term.c --- 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, #ifdef FEAT_TERMRESPONSE if (key_name[0] == NUL - /* URXVT mouse uses [#;#;#M, but we are matching [ */ - || key_name[0] == KS_URXVT_MOUSE -# ifdef FEAT_MBYTE - || u7_status == U7_SENT + /* Mouse codes of DEC, pterm, and URXVT start with [. 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 +# endif + ) { - /* Check for some responses from terminal start with "[" or - * CSI. + /* Check for some responses from the terminal starting with + * "[" or CSI: * - * - xterm version string: [>{x};{vers};{y}c + * - Xterm version string: [>{x};{vers};{y}c * Also eat other possible responses to t_RV, rxvt returns * "[?1;2c". Also accept CSI instead of [. * mrxvt has been reported to have "+" in the version. Assume * the escape sequence ends with a letter or one of "{|}~". * - * - cursor position report: [{row};{col}R - * The final byte is 'R'. now it is only used for checking for + * - Cursor position report: [{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, * u7_status is not "sent", it may be from a previous Vim that * just exited. But not for , 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; - - LOG_TR("Received U7 status"); - u7_status = U7_GOT; -# ifdef FEAT_AUTOCMD - did_cursorhold = TRUE; -# endif - if (col == 2) - aw = "single"; - else if (col == 3) - aw = "double"; - if (aw != NULL && STRCMP(aw, p_ambw) != 0) + if (row_char == '2' && col >= 2) { - /* 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 *aw = NULL; + + LOG_TR("Received U7 status"); + u7_status = U7_GOT; +# ifdef FEAT_AUTOCMD + did_cursorhold = TRUE; +# endif + 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); - - sprintf(buf, "set 'ambiwidth', redraw_asap(): %d", - r); - log_tr(buf); + /* 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); + } +# else + redraw_asap(CLEAR); +# endif } -# else - 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, 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, 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() { diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 389, +/**/ 388, /**/ 387,