aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/aucmd.c9
-rw-r--r--src/nvim/event/loop.c18
2 files changed, 20 insertions, 7 deletions
diff --git a/src/nvim/aucmd.c b/src/nvim/aucmd.c
index a69881431e..fc421116ea 100644
--- a/src/nvim/aucmd.c
+++ b/src/nvim/aucmd.c
@@ -5,7 +5,6 @@
#include "nvim/fileio.h"
#include "nvim/vim.h"
#include "nvim/main.h"
-#include "nvim/screen.h"
#include "nvim/ui.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
@@ -18,16 +17,12 @@ static void focusgained_event(void **argv)
do_autocmd_focusgained(*gainedp);
xfree(gainedp);
}
-static void schedule_event(void **argv)
-{
- bool *gainedp = argv[0];
- multiqueue_put(main_loop.events, focusgained_event, 1, gainedp);
-}
void aucmd_schedule_focusgained(bool gained)
{
bool *gainedp = xmalloc(sizeof(*gainedp));
*gainedp = gained;
- loop_schedule(&main_loop, event_create(schedule_event, 1, gainedp));
+ loop_schedule_deferred(&main_loop,
+ event_create(focusgained_event, 1, gainedp));
}
static void do_autocmd_focusgained(bool gained)
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index cc9088f776..570db6dfc3 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -74,6 +74,24 @@ void loop_schedule(Loop *loop, Event event)
uv_mutex_unlock(&loop->mutex);
}
+/// Schedules an event from another thread. Unlike loop_schedule(), the event
+/// is forwarded to `Loop.events`, instead of being processed immediately.
+///
+/// @see loop_schedule
+void loop_schedule_deferred(Loop *loop, Event event)
+{
+ Event *eventp = xmalloc(sizeof(*eventp));
+ *eventp = event;
+ loop_schedule(loop, event_create(loop_deferred_event, 2, loop, eventp));
+}
+static void loop_deferred_event(void **argv)
+{
+ Loop *loop = argv[0];
+ Event *eventp = argv[1];
+ multiqueue_put_event(loop->events, *eventp);
+ xfree(eventp);
+}
+
void loop_on_put(MultiQueue *queue, void *data)
{
Loop *loop = data;