0
0
mirror of https://github.com/vim/vim.git synced 2025-10-09 06:14:17 -04:00

patch 8.0.1020: when a timer calls getchar(1) input is overwritten

Problem:    When a timer calls getchar(1) input is overwritten.
Solution:   Increment tb_change_cnt in inchar(). (closes #1940)
This commit is contained in:
Bram Moolenaar
2017-08-30 18:52:56 +02:00
parent d41babef89
commit 0f0f230012
2 changed files with 17 additions and 10 deletions

View File

@@ -125,7 +125,7 @@ static int vgetorpeek(int);
static void map_free(mapblock_T **); static void map_free(mapblock_T **);
static void validate_maphash(void); static void validate_maphash(void);
static void showmap(mapblock_T *mp, int local); static void showmap(mapblock_T *mp, int local);
static int inchar(char_u *buf, int maxlen, long wait_time, int tb_change_cnt); static int inchar(char_u *buf, int maxlen, long wait_time);
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
static char_u *eval_map_expr(char_u *str, int c); static char_u *eval_map_expr(char_u *str, int c);
#endif #endif
@@ -462,8 +462,7 @@ flush_buffers(int flush_typeahead)
* of an escape sequence. * of an escape sequence.
* In an xterm we get one char at a time and we have to get them all. * In an xterm we get one char at a time and we have to get them all.
*/ */
while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L, while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0)
typebuf.tb_change_cnt) != 0)
; ;
typebuf.tb_off = MAXMAPLEN; typebuf.tb_off = MAXMAPLEN;
typebuf.tb_len = 0; typebuf.tb_len = 0;
@@ -2046,8 +2045,7 @@ vgetorpeek(int advance)
if (got_int) if (got_int)
{ {
/* flush all input */ /* flush all input */
c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L, c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L);
typebuf.tb_change_cnt);
/* /*
* If inchar() returns TRUE (script file was active) or we * If inchar() returns TRUE (script file was active) or we
* are inside a mapping, get out of insert mode. * are inside a mapping, get out of insert mode.
@@ -2610,8 +2608,7 @@ vgetorpeek(int advance)
&& (p_timeout && (p_timeout
|| (keylen == KEYLEN_PART_KEY && p_ttimeout)) || (keylen == KEYLEN_PART_KEY && p_ttimeout))
&& (c = inchar(typebuf.tb_buf + typebuf.tb_off && (c = inchar(typebuf.tb_buf + typebuf.tb_off
+ typebuf.tb_len, 3, 25L, + typebuf.tb_len, 3, 25L)) == 0)
typebuf.tb_change_cnt)) == 0)
{ {
colnr_T col = 0, vcol; colnr_T col = 0, vcol;
char_u *ptr; char_u *ptr;
@@ -2848,7 +2845,7 @@ vgetorpeek(int advance)
? -1L ? -1L
: ((keylen == KEYLEN_PART_KEY && p_ttm >= 0) : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
? p_ttm ? p_ttm
: p_tm)), typebuf.tb_change_cnt); : p_tm)));
#ifdef FEAT_CMDL_INFO #ifdef FEAT_CMDL_INFO
if (i != 0) if (i != 0)
@@ -2954,12 +2951,12 @@ vgetorpeek(int advance)
inchar( inchar(
char_u *buf, char_u *buf,
int maxlen, int maxlen,
long wait_time, /* milli seconds */ long wait_time) /* milli seconds */
int tb_change_cnt)
{ {
int len = 0; /* init for GCC */ int len = 0; /* init for GCC */
int retesc = FALSE; /* return ESC with gotint */ int retesc = FALSE; /* return ESC with gotint */
int script_char; int script_char;
int tb_change_cnt = typebuf.tb_change_cnt;
if (wait_time == -1L || wait_time > 100L) /* flush output before waiting */ if (wait_time == -1L || wait_time > 100L) /* flush output before waiting */
{ {
@@ -3065,9 +3062,17 @@ inchar(
len = ui_inchar(buf, maxlen / 3, wait_time, tb_change_cnt); len = ui_inchar(buf, maxlen / 3, wait_time, tb_change_cnt);
} }
/* If the typebuf was changed further down, it is like nothing was added by
* this call. */
if (typebuf_changed(tb_change_cnt)) if (typebuf_changed(tb_change_cnt))
return 0; return 0;
/* Note the change in the typeahead buffer, this matters for when
* vgetorpeek() is called recursively, e.g. using getchar(1) in a timer
* function. */
if (len > 0 && ++typebuf.tb_change_cnt == 0)
typebuf.tb_change_cnt = 1;
return fix_input_buffer(buf, len); return fix_input_buffer(buf, len);
} }

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1020,
/**/ /**/
1019, 1019,
/**/ /**/