# HG changeset patch # User Christian Brabandt # Date 1498313703 -7200 # Node ID 0ec755ff1fe25026f31ab4efb18e113f3fa23886 # Parent 9a74b20327e4b8737b19fcb1498f69d0fbb4ad3e patch 8.0.0670: can't use input() in a timer callback commit https://github.com/vim/vim/commit/1e8e14552e0cc8881411eb8fbe39a654dae42554 Author: Bram Moolenaar Date: Sat Jun 24 16:03:06 2017 +0200 patch 8.0.0670: can't use input() in a timer callback Problem: Can't use input() in a timer callback. (Cosmin Popescu) Solution: Reset vgetc_busy and set timer_busy. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/1790, closes #1129) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3191,7 +3191,7 @@ f_feedkeys(typval_T *argvars, typval_T * ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE), insert ? 0 : typebuf.tb_len, !typed, FALSE); vim_free(keys_esc); - if (vgetc_busy) + if (vgetc_busy || timer_busy) typebuf_was_filled = TRUE; if (execute) { diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -1209,11 +1209,18 @@ check_due_timer(void) this_due = GET_TIMEDIFF(timer, now); if (this_due <= 1) { + int save_timer_busy = timer_busy; + int save_vgetc_busy = vgetc_busy; + + timer_busy = timer_busy > 0 || vgetc_busy > 0; + vgetc_busy = 0; timer->tr_firing = TRUE; timer_callback(timer); timer->tr_firing = FALSE; timer_next = timer->tr_next; did_one = TRUE; + timer_busy = save_timer_busy; + vgetc_busy = save_vgetc_busy; /* Only fire the timer again if it repeats and stop_timer() wasn't * called while inside the callback (tr_id == -1). */ diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1659,6 +1659,7 @@ EXTERN int in_free_unref_items INIT(= F #ifdef FEAT_TIMERS EXTERN int did_add_timer INIT(= FALSE); +EXTERN int timer_busy INIT(= 0); /* when timer is inside vgetc() then > 0 */ #endif #ifdef FEAT_EVAL diff --git a/src/testdir/test_timers.vim b/src/testdir/test_timers.vim --- a/src/testdir/test_timers.vim +++ b/src/testdir/test_timers.vim @@ -172,5 +172,21 @@ func Test_stop_all_in_callback() call assert_equal(0, len(info)) endfunc +func FeedkeysCb(timer) + call feedkeys("hello\", 'nt') +endfunc + +func InputCb(timer) + call timer_start(10, 'FeedkeysCb') + let g:val = input('?') + call Resume() +endfunc + +func Test_input_in_timer() + let g:val = '' + call timer_start(10, 'InputCb') + call Standby(1000) + call assert_equal('hello', g:val) +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 670, +/**/ 669, /**/ 668,