mirror of
https://github.com/neovim/neovim.git
synced 2025-09-19 01:38:16 +00:00
main: Refactor normal_enter to call os_inchar
directly
This makes it impossible for K_EVENT to interfere with mappings, but it also disables processing of events while in the middle of a mapping (Though this will be fixed later as this refactoring progresses). `may_sync_undo` is now called when K_EVENT is received. This is necessary to correctly update undo entry lists before executing some action.
This commit is contained in:
@@ -464,10 +464,34 @@ void normal_enter(bool cmdwin, bool noexmode)
|
||||
continue;
|
||||
}
|
||||
|
||||
input_enable_events();
|
||||
int c = safe_vgetc();
|
||||
input_disable_events();
|
||||
if (!normal_execute(&state, c)) {
|
||||
int key;
|
||||
|
||||
if (char_avail() || using_script() || input_available()) {
|
||||
// Don't block for events if there's a character already available for
|
||||
// processing. Characters can come from mappings, scripts and other
|
||||
// sources, so this scenario is very common.
|
||||
key = safe_vgetc();
|
||||
} else if (!queue_empty(loop.events)) {
|
||||
// Event was made available after the last queue_process_events call
|
||||
key = K_EVENT;
|
||||
} else {
|
||||
input_enable_events();
|
||||
// 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
|
||||
// mapping engine. If an event was put into the queue, we send K_EVENT
|
||||
// directly.
|
||||
(void)os_inchar(NULL, 0, -1, 0);
|
||||
input_disable_events();
|
||||
key = !queue_empty(loop.events) ? K_EVENT : safe_vgetc();
|
||||
}
|
||||
|
||||
if (key == K_EVENT) {
|
||||
may_sync_undo();
|
||||
}
|
||||
|
||||
if (!normal_execute(&state, key)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user