| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.389 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 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) |
| Files: src/globals.h, src/os_unix.c, src/term.c, src/proto/term.pro |
| |
| |
| |
| |
| |
| *** 1336,1344 **** |
| #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 */ |
| --- 1336,1341 ---- |
| |
| |
| |
| *** 3667,3674 **** |
| void |
| check_mouse_termcode() |
| { |
| - xterm_conflict_mouse = FALSE; |
| - |
| # ifdef FEAT_MOUSE_XTERM |
| if (use_xterm_mouse() |
| # ifdef FEAT_MOUSE_URXVT |
| --- 3667,3672 ---- |
| |
| *** 3713,3719 **** |
| # endif |
| |
| # ifdef FEAT_MOUSE_JSB |
| ! /* There is no conflict, but it was disabled for xterm before. */ |
| if (!use_xterm_mouse() |
| # ifdef FEAT_GUI |
| && !gui.in_use |
| --- 3711,3717 ---- |
| # endif |
| |
| # ifdef FEAT_MOUSE_JSB |
| ! /* Conflicts with xterm mouse: "\033[" and "\033[M" ??? */ |
| if (!use_xterm_mouse() |
| # ifdef FEAT_GUI |
| && !gui.in_use |
| |
| *** 3740,3784 **** |
| # 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. */ |
| 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 */ |
| 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 */ |
| if (use_xterm_mouse() == 3 |
| # ifdef FEAT_GUI |
| && !gui.in_use |
| --- 3738,3768 ---- |
| # endif |
| |
| # ifdef FEAT_MOUSE_DEC |
| ! /* Conflicts with xterm mouse: "\033[" and "\033[M" */ |
| if (!use_xterm_mouse() |
| # 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 "["))); |
| else |
| del_mouse_termcode(KS_DEC_MOUSE); |
| # endif |
| # ifdef FEAT_MOUSE_PTERM |
| ! /* same conflict as the dec mouse */ |
| if (!use_xterm_mouse() |
| # ifdef FEAT_GUI |
| && !gui.in_use |
| # endif |
| ) |
| set_mouse_termcode(KS_PTERM_MOUSE, |
| (char_u *) IF_EB("\033[", ESC_STR "[")); |
| else |
| del_mouse_termcode(KS_PTERM_MOUSE); |
| # endif |
| # ifdef FEAT_MOUSE_URXVT |
| ! /* same conflict as the dec mouse */ |
| if (use_xterm_mouse() == 3 |
| # ifdef FEAT_GUI |
| && !gui.in_use |
| |
| *** 3794,3801 **** |
| 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); |
| --- 3778,3783 ---- |
| |
| |
| |
| *** 153,163 **** |
| 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[] = |
| --- 153,158 ---- |
| |
| *** 3312,3351 **** |
| } |
| |
| #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 |
| --- 3307,3312 ---- |
| |
| *** 3358,3365 **** |
| * 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 |
| --- 3319,3324 ---- |
| |
| *** 3373,3379 **** |
| # ifdef UNIX |
| && isatty(1) |
| && isatty(read_cmd_fd) |
| - && !xterm_conflict_mouse |
| # endif |
| && *T_CRV != NUL) |
| { |
| --- 3332,3337 ---- |
| |
| *** 3742,3749 **** |
| #if defined(WIN3264) && !defined(FEAT_GUI) |
| if (s[0] == K_NUL) |
| { |
| ! STRMOVE(s + 1, s); |
| ! s[1] = 3; |
| } |
| #endif |
| |
| --- 3700,3707 ---- |
| #if defined(WIN3264) && !defined(FEAT_GUI) |
| if (s[0] == K_NUL) |
| { |
| ! STRMOVE(s + 1, s); |
| ! s[1] = 3; |
| } |
| #endif |
| |
| |
| *** 4212,4235 **** |
| |
| #ifdef FEAT_TERMRESPONSE |
| if (key_name[0] == NUL |
| ! /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */ |
| || 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. |
| * |
| ! * - 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 |
| * ambiguous-width character state. |
| */ |
| p = tp[0] == CSI ? tp + 1 : tp + 2; |
| --- 4170,4200 ---- |
| |
| #ifdef FEAT_TERMRESPONSE |
| if (key_name[0] == NUL |
| ! /* 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 |
| # endif |
| ! ) |
| { |
| ! /* Check for some responses from the terminal starting with |
| ! * "<Esc>[" or CSI: |
| * |
| ! * - 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 must be 'R'. It is used for checking the |
| * ambiguous-width character state. |
| */ |
| p = tp[0] == CSI ? tp + 1 : tp + 2; |
| |
| *** 4269,4304 **** |
| * 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) |
| { |
| ! 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) |
| ! { |
| ! /* 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 |
| } |
| key_name[0] = (int)KS_EXTRA; |
| key_name[1] = (int)KE_IGNORE; |
| --- 4234,4275 ---- |
| * 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') |
| { |
| ! if (row_char == '2' && col >= 2) |
| ! { |
| ! 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) |
| { |
| ! /* 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 |
| + } |
| } |
| key_name[0] = (int)KS_EXTRA; |
| key_name[1] = (int)KE_IGNORE; |
| |
| *** 4563,4581 **** |
| return -1; |
| |
| /* when mouse reporting is SGR, add 32 to mouse code */ |
| ! 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') |
| mouse_code |= MOUSE_RELEASE; |
| ! else if (*p != 'M') |
| return -1; |
| ! p++; |
| |
| slen += (int)(p - (tp + slen)); |
| |
| --- 4534,4552 ---- |
| return -1; |
| |
| /* when mouse reporting is SGR, add 32 to mouse code */ |
| ! 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') |
| mouse_code |= MOUSE_RELEASE; |
| ! else if (*p != 'M') |
| return -1; |
| ! p++; |
| |
| slen += (int)(p - (tp + slen)); |
| |
| |
| *** 4592,4598 **** |
| for (slen2 = slen; slen2 < len; slen2++) |
| { |
| if (tp[slen2] == 'M' |
| ! || (key_name[0] == KS_SGR_MOUSE |
| && tp[slen2] == 'm')) |
| { |
| cmd_complete = 1; |
| --- 4563,4569 ---- |
| for (slen2 = slen; slen2 < len; slen2++) |
| { |
| if (tp[slen2] == 'M' |
| ! || (key_name[0] == KS_SGR_MOUSE |
| && tp[slen2] == 'm')) |
| { |
| cmd_complete = 1; |
| |
| *** 5769,5774 **** |
| --- 5740,5748 ---- |
| * 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() |
| { |
| |
| |
| |
| *** 34,41 **** |
| 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)); |
| --- 34,39 ---- |
| |
| |
| |
| *** 736,737 **** |
| --- 736,739 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 389, |
| /**/ |
| |
| -- |
| The only way the average employee can speak to an executive is by taking a |
| second job as a golf caddie. |
| (Scott Adams - The Dilbert principle) |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |