summaryrefslogtreecommitdiff
path: root/src/term.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-07-30 17:21:58 +0200
committerBram Moolenaar <Bram@vim.org>2014-07-30 17:21:58 +0200
commit4e067c898ef1f4a34cd70ddf3de3a1e60ac23c84 (patch)
tree369d10f3185037c11dd64d8c20292376197fe8d4 /src/term.c
parentb81c85d8f35850ee8f377a2672c506131549f53c (diff)
downloadvim-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.c136
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()
{