Skip to content

Commit

Permalink
patch 8.0.1556: may not parse the t_RS response correctly
Browse files Browse the repository at this point in the history
Problem:    May not parse the t_RS response correctly, resulting in wrong
            characters in the input stream.
Solution:   When the t_RS response is partly received wait for more
            characters.
  • Loading branch information
brammool committed Mar 2, 2018
1 parent 77780b6 commit 590ec87
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 24 deletions.
59 changes: 35 additions & 24 deletions src/term.c
Expand Up @@ -4866,7 +4866,7 @@ check_termcode(
* {tail} can be Esc>\ or STERM
*
* Check for cursor shape response from xterm:
* {lead}1$r<number> q{tail}
* {lead}1$r<digit> q{tail}
*
* {lead} can be <Esc>P or DCS
* {tail} can be Esc>\ or STERM
Expand Down Expand Up @@ -4897,35 +4897,46 @@ check_termcode(
break;
}
}
else if ((len >= j + 6 && isdigit(argp[3]))
&& argp[4] == ' '
&& argp[5] == 'q')
else
{
/* cursor shape response */
i = j + 6;
if ((tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\')
|| tp[i] == STERM)
/* Probably the cursor shape response. Make sure that "i"
* is equal to "len" when there are not sufficient
* characters. */
for (i = j + 3; i < len; ++i)
{
int number = argp[3] - '0';

/* 0, 1 = block blink, 2 = block
* 3 = underline blink, 4 = underline
* 5 = vertical bar blink, 6 = vertical bar */
number = number == 0 ? 1 : number;
initial_cursor_shape = (number + 1) / 2;
/* The blink flag is actually inverted, compared to
* the value set with T_SH. */
initial_cursor_shape_blink =
if (i - j == 3 && !isdigit(tp[i]))
break;
if (i - j == 4 && tp[i] != ' ')
break;
if (i - j == 5 && tp[i] != 'q')
break;
if (i - j == 6 && tp[i] != ESC && tp[i] != STERM)
break;
if ((i - j == 6 && tp[i] == STERM)
|| (i - j == 7 && tp[i] == '\\'))
{
int number = argp[3] - '0';

/* 0, 1 = block blink, 2 = block
* 3 = underline blink, 4 = underline
* 5 = vertical bar blink, 6 = vertical bar */
number = number == 0 ? 1 : number;
initial_cursor_shape = (number + 1) / 2;
/* The blink flag is actually inverted, compared to
* the value set with T_SH. */
initial_cursor_shape_blink =
(number & 1) ? FALSE : TRUE;
rcs_status = STATUS_GOT;
LOG_TR("Received cursor shape response");
rcs_status = STATUS_GOT;
LOG_TR("Received cursor shape response");

key_name[0] = (int)KS_EXTRA;
key_name[1] = (int)KE_IGNORE;
slen = i + 1 + (tp[i] == ESC);
key_name[0] = (int)KS_EXTRA;
key_name[1] = (int)KE_IGNORE;
slen = i + 1;
# ifdef FEAT_EVAL
set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
# endif
break;
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -778,6 +778,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1556,
/**/
1555,
/**/
Expand Down

0 comments on commit 590ec87

Please sign in to comment.