diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-06-24 16:03:06 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-06-24 16:03:06 +0200 |
commit | 1e8e14552e0cc8881411eb8fbe39a654dae42554 (patch) | |
tree | f28d457d94b1ac4db1fe700f23bb31d428e674d5 | |
parent | 24a9e348aa88a6c60ae0cdf5c4a777d8c03b08ca (diff) |
patch 8.0.0670: can't use input() in a timer callbackv8.0.0670
Problem: Can't use input() in a timer callback. (Cosmin Popescu)
Solution: Reset vgetc_busy and set timer_busy. (Ozaki Kiichi, closes #1790,
closes #1129)
-rw-r--r-- | src/evalfunc.c | 2 | ||||
-rw-r--r-- | src/ex_cmds2.c | 7 | ||||
-rw-r--r-- | src/globals.h | 1 | ||||
-rw-r--r-- | src/testdir/test_timers.vim | 16 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 27 insertions, 1 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 7c781d8b91..581ad7b5bf 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3191,7 +3191,7 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED) 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 index 225225a78c..33ad924d22 100644 --- 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 index 56df6d5083..7cf928c16d 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1659,6 +1659,7 @@ EXTERN int in_free_unref_items INIT(= FALSE); #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 index ebc6665808..fdb74e7958 100644 --- 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\<CR>", '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 index d1c6119a19..d9fef0afd0 100644 --- 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, |