diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/edit.c | 12 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 14 | ||||
-rw-r--r-- | src/nvim/getchar.c | 1 | ||||
-rw-r--r-- | src/nvim/message.c | 6 | ||||
-rw-r--r-- | src/nvim/normal.c | 14 | ||||
-rw-r--r-- | src/nvim/os/event.c | 20 | ||||
-rw-r--r-- | src/nvim/os/input.c | 38 |
7 files changed, 61 insertions, 44 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index d7910347fc..b9ecbc71fe 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -593,9 +593,17 @@ edit ( * Get a character for Insert mode. Ignore K_IGNORE. */ lastc = c; /* remember previous char for CTRL-D */ + event_enable_deferred(); do { c = safe_vgetc(); } while (c == K_IGNORE); + event_disable_deferred(); + + if (c == K_EVENT) { + c = lastc; + event_process(); + continue; + } /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ did_cursorhold = TRUE; @@ -943,10 +951,6 @@ doESCkey: did_cursorhold = TRUE; break; - case K_EVENT: - event_process(); - break; - case K_HOME: /* <Home> */ case K_KHOME: case K_S_HOME: diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 5feff4d456..2be3757821 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -311,9 +311,16 @@ getcmdline ( /* Get a character. Ignore K_IGNORE, it should not do anything, such * as stop completion. */ + event_enable_deferred(); do { c = safe_vgetc(); } while (c == K_IGNORE); + event_disable_deferred(); + + if (c == K_EVENT) { + event_process(); + continue; + } if (KeyTyped) { some_key_typed = TRUE; @@ -769,11 +776,6 @@ getcmdline ( * Big switch for a typed command line character. */ switch (c) { - case K_EVENT: - event_process(); - // Force a redraw even though the command line didn't change - shell_resized(); - goto cmdline_not_changed; case K_BS: case Ctrl_H: case K_DEL: @@ -1885,8 +1887,6 @@ redraw: } if (IS_SPECIAL(c1)) { - // Process deferred events - event_process(); // Ignore other special key codes continue; } diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index fd60664b7b..1bec0fa1bb 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -2481,7 +2481,6 @@ inchar ( char_u dum[DUM_LEN + 1]; for (;; ) { - event_process(); len = ui_inchar(dum, DUM_LEN, 0L, 0); if (len == 0 || (len == 1 && dum[0] == 3)) break; diff --git a/src/nvim/message.c b/src/nvim/message.c index ee83fd371e..23feeab173 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -44,7 +44,6 @@ #include "nvim/term.h" #include "nvim/ui.h" #include "nvim/os/os.h" -#include "nvim/os/event.h" /* * To be able to scroll back at the "more" and "hit-enter" prompts we need to @@ -2076,9 +2075,6 @@ static int do_more_prompt(int typed_char) toscroll = 0; switch (c) { - case K_EVENT: - event_process(); - break; case BS: /* scroll one line back */ case K_BS: case 'k': @@ -2738,8 +2734,6 @@ do_dialog ( break; default: /* Could be a hotkey? */ if (c < 0) { /* special keys are ignored here */ - // drain event queue to prevent infinite loop - event_process(); continue; } if (c == ':' && ex_cmd) { diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 29070ff188..f58e044c2c 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -312,7 +312,6 @@ static const struct nv_cmd { {K_F8, farsi_fkey, 0, 0}, {K_F9, farsi_fkey, 0, 0}, {K_CURSORHOLD, nv_cursorhold, NV_KEEPREG, 0}, - {K_EVENT, nv_event, NV_KEEPREG, 0}, }; /* Number of commands in nv_cmds[]. */ @@ -483,7 +482,15 @@ normal_cmd ( /* * Get the command character from the user. */ + event_enable_deferred(); c = safe_vgetc(); + event_disable_deferred(); + + if (c == K_EVENT) { + event_process(); + return; + } + LANGMAP_ADJUST(c, true); /* @@ -7373,8 +7380,3 @@ static void nv_cursorhold(cmdarg_T *cap) did_cursorhold = true; cap->retval |= CA_COMMAND_BUSY; /* don't call edit() now */ } - -static void nv_event(cmdarg_T *cap) -{ - event_process(); -} diff --git a/src/nvim/os/event.c b/src/nvim/os/event.c index 1477072f4f..34560610bd 100644 --- a/src/nvim/os/event.c +++ b/src/nvim/os/event.c @@ -18,6 +18,8 @@ #include "nvim/vim.h" #include "nvim/memory.h" #include "nvim/misc2.h" +#include "nvim/term.h" +#include "nvim/screen.h" #include "nvim/lib/klist.h" @@ -39,6 +41,7 @@ typedef struct { // loop(to avoid recursion), but before returning from // `event_poll` static klist_t(Event) *deferred_events = NULL, *immediate_events = NULL; +static int deferred_events_allowed = 0; void event_init(void) { @@ -134,7 +137,17 @@ void event_poll(int ms) bool event_has_deferred(void) { - return !kl_empty(deferred_events); + return deferred_events_allowed && !kl_empty(deferred_events); +} + +void event_enable_deferred(void) +{ + ++deferred_events_allowed; +} + +void event_disable_deferred(void) +{ + --deferred_events_allowed; } // Queue an event @@ -146,6 +159,11 @@ void event_push(Event event, bool deferred) void event_process(void) { process_events_from(deferred_events); + + if (must_redraw) { + update_screen(0); + out_flush(); + } } static void process_events_from(klist_t(Event) *queue) diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 3ebfb3f12b..d10d20b20e 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -84,13 +84,11 @@ void input_stop(void) // Low level input function. int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt) { - InbufPollResult result; - - if (event_has_deferred()) { - // Return pending event bytes - return push_event_key(buf, maxlen); + if (rbuffer_pending(input_buffer)) { + return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen); } + InbufPollResult result; if (ms >= 0) { if ((result = inbuf_poll(ms)) == kInputNone) { return 0; @@ -110,24 +108,27 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt) } } - // If there are deferred events, return the keys directly - if (event_has_deferred()) { - return push_event_key(buf, maxlen); - } - // If input was put directly in typeahead buffer bail out here. if (typebuf_changed(tb_change_cnt)) { return 0; } + if (rbuffer_pending(input_buffer)) { + // Safe to convert rbuffer_read to int, it will never overflow since we use + // relatively small buffers. + return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen); + } + + // If there are deferred events, return the keys directly + if (event_has_deferred()) { + return push_event_key(buf, maxlen); + } + if (result == kInputEof) { read_error_exit(); - return 0; } - // Safe to convert rbuffer_read to int, it will never overflow since - // we use relatively small buffers. - return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen); + return 0; } // Check if a character is available for reading @@ -319,10 +320,9 @@ static int push_event_key(uint8_t *buf, int maxlen) // Check if there's pending input static bool input_ready(void) { - return typebuf_was_filled || // API call filled typeahead - event_has_deferred() || // Events must be processed - (!embedded_mode && ( - rbuffer_pending(input_buffer) > 0 || // Stdin input - eof)); // Stdin closed + return typebuf_was_filled || // API call filled typeahead + rbuffer_pending(input_buffer) > 0 || // Stdin input + event_has_deferred() || // Events must be processed + (!embedded_mode && eof); // Stdin closed } |