1// Bridge for communication between a UI thread and nvim core.
2// Used by the built-in TUI and libnvim-based UIs.
3#ifndef NVIM_UI_BRIDGE_H
4#define NVIM_UI_BRIDGE_H
5
6#include <uv.h>
7
8#include "nvim/ui.h"
9#include "nvim/event/defs.h"
10
11typedef struct ui_bridge_data UIBridgeData;
12typedef void(*ui_main_fn)(UIBridgeData *bridge, UI *ui);
13struct ui_bridge_data {
14 UI bridge; // actual UI passed to ui_attach
15 UI *ui; // UI pointer that will have its callback called in
16 // another thread
17 event_scheduler scheduler;
18 uv_thread_t ui_thread;
19 ui_main_fn ui_main;
20 uv_mutex_t mutex;
21 uv_cond_t cond;
22 // When the UI thread is called, the main thread will suspend until
23 // the call returns. This flag is used as a condition for the main
24 // thread to continue.
25 bool ready;
26 // When a stop request is sent from the main thread, it must wait until the UI
27 // thread finishes handling all events. This flag is set by the UI thread as a
28 // signal that it will no longer send messages to the main thread.
29 bool stopped;
30};
31
32#define CONTINUE(b) \
33 do { \
34 UIBridgeData *d = (UIBridgeData *)b; \
35 uv_mutex_lock(&d->mutex); \
36 d->ready = true; \
37 uv_cond_signal(&d->cond); \
38 uv_mutex_unlock(&d->mutex); \
39 } while (0)
40
41
42#ifdef INCLUDE_GENERATED_DECLARATIONS
43# include "ui_bridge.h.generated.h"
44#endif
45#endif // NVIM_UI_BRIDGE_H
46