aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/edit.c12
-rw-r--r--src/nvim/ex_getln.c14
-rw-r--r--src/nvim/getchar.c1
-rw-r--r--src/nvim/message.c6
-rw-r--r--src/nvim/normal.c14
-rw-r--r--src/nvim/os/event.c20
6 files changed, 42 insertions, 25 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)