To: vim_dev@googlegroups.com Subject: Patch 8.0.0670 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.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) Files: src/evalfunc.c, src/ex_cmds2.c, src/globals.h, src/testdir/test_timers.vim *** ../vim-8.0.0669/src/evalfunc.c 2017-06-22 22:00:46.414155699 +0200 --- src/evalfunc.c 2017-06-24 15:57:10.094794947 +0200 *************** *** 3191,3197 **** ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE), insert ? 0 : typebuf.tb_len, !typed, FALSE); vim_free(keys_esc); ! if (vgetc_busy) typebuf_was_filled = TRUE; if (execute) { --- 3191,3197 ---- ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE), insert ? 0 : typebuf.tb_len, !typed, FALSE); vim_free(keys_esc); ! if (vgetc_busy || timer_busy) typebuf_was_filled = TRUE; if (execute) { *** ../vim-8.0.0669/src/ex_cmds2.c 2017-06-04 17:47:38.225528115 +0200 --- src/ex_cmds2.c 2017-06-24 15:50:30.905963239 +0200 *************** *** 1209,1219 **** --- 1209,1226 ---- 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). */ *** ../vim-8.0.0669/src/globals.h 2017-06-04 17:47:38.225528115 +0200 --- src/globals.h 2017-06-24 15:50:30.905963239 +0200 *************** *** 1659,1664 **** --- 1659,1665 ---- #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 *** ../vim-8.0.0669/src/testdir/test_timers.vim 2016-09-10 13:40:34.000000000 +0200 --- src/testdir/test_timers.vim 2017-06-24 15:49:16.666552788 +0200 *************** *** 172,176 **** --- 172,192 ---- 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 *** ../vim-8.0.0669/src/version.c 2017-06-24 15:39:03.587409087 +0200 --- src/version.c 2017-06-24 16:02:20.912329966 +0200 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 670, /**/ -- hundred-and-one symptoms of being an internet addict: 82. AT&T names you Customer of the Month for the third consecutive time. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///