aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval/funcs.c13
-rw-r--r--test/functional/core/job_spec.lua33
2 files changed, 43 insertions, 3 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index a0c18a4c95..fbaa6e679f 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -4177,8 +4177,6 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
return;
}
- ui_busy_start();
- ui_flush();
list_T *args = argvars[0].vval.v_list;
Channel **jobs = xcalloc((size_t)tv_list_len(args), sizeof(*jobs));
MultiQueue *waiting_jobs = multiqueue_new_parent(loop_on_put, &main_loop);
@@ -4215,6 +4213,13 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
before = os_hrtime();
}
+ // Only mark the UI as busy when jobwait() blocks
+ const bool busy = remaining != 0;
+ if (busy) {
+ ui_busy_start();
+ ui_flush();
+ }
+
for (i = 0; i < tv_list_len(args); i++) {
if (remaining == 0) {
break; // Timeout.
@@ -4256,7 +4261,9 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
multiqueue_free(waiting_jobs);
xfree(jobs);
- ui_busy_stop();
+ if (busy) {
+ ui_busy_stop();
+ }
tv_list_ref(rv);
rettv->v_type = VAR_LIST;
rettv->vval.v_list = rv;
diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua
index 952437d80e..e833b5127d 100644
--- a/test/functional/core/job_spec.lua
+++ b/test/functional/core/job_spec.lua
@@ -973,6 +973,39 @@ describe('jobs', function()
feed('<CR>')
fn.jobstop(api.nvim_get_var('id'))
end)
+
+ it('does not set UI busy with zero timeout #31712', function()
+ local screen = Screen.new(50, 6)
+ command([[let g:id = jobstart(['sleep', '0.3'])]])
+ local busy = 0
+ screen._handle_busy_start = (function(orig)
+ return function()
+ orig(screen)
+ busy = busy + 1
+ end
+ end)(screen._handle_busy_start)
+ source([[
+ func PrintAndPoll()
+ echon "aaa\nbbb"
+ call jobwait([g:id], 0)
+ echon "\nccc"
+ endfunc
+ ]])
+ feed_command('call PrintAndPoll()')
+ screen:expect {
+ grid = [[
+ |
+ {3: }|
+ aaa |
+ bbb |
+ ccc |
+ {6:Press ENTER or type command to continue}^ |
+ ]],
+ }
+ feed('<CR>')
+ fn.jobstop(api.nvim_get_var('id'))
+ eq(0, busy)
+ end)
end)
pending('exit event follows stdout, stderr', function()