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