diff options
| author | Björn Linse <bjorn.linse@gmail.com> | 2016-07-01 17:34:28 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-01 17:34:28 +0200 | 
| commit | 6f4f654231955bc655d0b8a92c21878429b8c446 (patch) | |
| tree | 8e597e6425ad9d086ec6410843f1cbbcb792d458 /src/nvim/eval.c | |
| parent | c8da12b9a6cd6060b02e06af90ea231e92724fec (diff) | |
| parent | 5c754a2d2263e455ba3704cd278d52b254d195df (diff) | |
| download | rneovim-6f4f654231955bc655d0b8a92c21878429b8c446.tar.gz rneovim-6f4f654231955bc655d0b8a92c21878429b8c446.tar.bz2 rneovim-6f4f654231955bc655d0b8a92c21878429b8c446.zip | |
Merge pull request #4880 from bfredl/zerotimer
make timers work correctly when timeout or repeat is zero
Diffstat (limited to 'src/nvim/eval.c')
| -rw-r--r-- | src/nvim/eval.c | 13 | 
1 files changed, 13 insertions, 0 deletions
| diff --git a/src/nvim/eval.c b/src/nvim/eval.c index ac0daa226a..9a86c5765c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -435,6 +435,7 @@ typedef struct {    TimeWatcher tw;    int timer_id;    int repeat_count; +  long timeout;    bool stopped;    ufunc_T *callback;  } timer_T; @@ -16639,6 +16640,9 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv)      }      if (dict_find(dict, (char_u *)"repeat", -1) != NULL) {        repeat = get_dict_number(dict, (char_u *)"repeat"); +      if (repeat == 0) { +        repeat = 1; +      }      }    } @@ -16656,6 +16660,7 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv)    timer = xmalloc(sizeof *timer);    timer->stopped = false;    timer->repeat_count = repeat; +  timer->timeout = timeout;    timer->timer_id = last_timer_id++;    timer->callback = func; @@ -16710,6 +16715,14 @@ static void timer_due_cb(TimeWatcher *tw, void *data)    call_user_func(timer->callback, ARRAY_SIZE(argv), argv, &rettv,                   curwin->w_cursor.lnum, curwin->w_cursor.lnum, NULL);    clear_tv(&rettv); + +  if (!timer->stopped && timer->timeout == 0) { +    // special case: timeout=0 means the callback will be +    // invoked again on the next event loop tick. +    // we don't use uv_idle_t to not spin the event loop +    // when the main loop is blocked. +    time_watcher_start(&timer->tw, timer_due_cb, 0, 0); +  }  }  static void timer_stop(timer_T *timer) | 
