fix(f_wait): flush UI before blocking (#25962)

This commit is contained in:
zeertzjq
2023-11-10 15:24:36 +08:00
committed by GitHub
parent bf5cf8ae82
commit d5a85d737a
7 changed files with 82 additions and 26 deletions

View File

@@ -2911,6 +2911,9 @@ static void f_wait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
bool error = false;
const int called_emsg_before = called_emsg;
// Flush screen updates before blocking.
ui_flush();
LOOP_PROCESS_EVENTS_UNTIL(&main_loop, main_loop.events, timeout,
eval_expr_typval(&expr, false, &argv, 0, &exprval) != OK
|| tv_get_number_chk(&exprval, &error)

View File

@@ -1723,7 +1723,7 @@ static void getchar_common(typval_T *argvars, typval_T *rettv)
// getchar(): blocking wait.
// TODO(bfredl): deduplicate shared logic with state_enter ?
if (!char_avail()) {
// flush output before waiting
// Flush screen updates before blocking.
ui_flush();
(void)os_inchar(NULL, 0, -1, typebuf.tb_change_cnt, main_loop.events);
if (!multiqueue_empty(main_loop.events)) {

View File

@@ -463,7 +463,7 @@ static int nlua_wait(lua_State *lstate)
int pcall_status = 0;
bool callback_result = false;
// Flush UI before blocking
// Flush screen updates before blocking.
ui_flush();
LOOP_PROCESS_EVENTS_UNTIL(&main_loop,

View File

@@ -70,7 +70,7 @@ getkey:
update_screen();
setcursor(); // put cursor back where it belongs
}
// Flush screen updates before blocking
// Flush screen updates before blocking.
ui_flush();
// Call `os_inchar` directly to block for events or user input without
// consuming anything from `input_buffer`(os/input.c) or calling the