aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/main.c3
-rw-r--r--src/nvim/tui/tui.c15
-rw-r--r--src/nvim/ui.c8
-rw-r--r--src/nvim/ui.h3
-rw-r--r--src/nvim/ui_bridge.c11
5 files changed, 30 insertions, 10 deletions
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 0346414697..5d826d9524 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -563,6 +563,9 @@ int main(int argc, char **argv)
(void)eval_has_provider("clipboard");
}
+ if (!headless_mode) {
+ ui_builtin_after_startup();
+ }
TIME_MSG("before starting main loop");
ILOG("starting main loop");
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 49aa41b9b0..0d3a241793 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -126,6 +126,7 @@ UI *tui_start(void)
{
UI *ui = xcalloc(1, sizeof(UI));
ui->stop = tui_stop;
+ ui->after_startup = tui_after_startup;
ui->rgb = p_tgc;
ui->resize = tui_resize;
ui->clear = tui_clear;
@@ -174,13 +175,7 @@ static size_t unibi_pre_fmt_str(TUIData *data, unsigned int unibi_index,
static void terminfo_after_startup_event(void **argv)
{
UI *ui = argv[0];
- bool defer = argv[1] != NULL; // clever(?) boolean without malloc() dance.
TUIData *data = ui->data;
- if (defer) { // We're on the main-loop. Now forward to the TUI loop.
- loop_schedule(data->loop,
- event_create(terminfo_after_startup_event, 2, ui, NULL));
- return;
- }
// Enable bracketed paste
unibi_out_ext(ui, data->unibi_ext.enable_bracketed_paste);
// Enable focus reporting
@@ -278,9 +273,13 @@ static void terminfo_start(UI *ui)
uv_pipe_init(&data->write_loop, &data->output_handle.pipe, 0);
uv_pipe_open(&data->output_handle.pipe, data->out_fd);
}
+}
- loop_schedule(&main_loop,
- event_create(terminfo_after_startup_event, 2, ui, ui));
+static void tui_after_startup(UI *ui)
+{
+ TUIData *data = ui->data;
+ loop_schedule(data->loop,
+ event_create(terminfo_after_startup_event, 1, ui));
}
static void terminfo_stop(UI *ui)
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 81da88c54a..5c8e9380db 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -138,6 +138,14 @@ void ui_builtin_start(void)
#endif
}
+/// Immediately after VimEnter event.
+void ui_builtin_after_startup(void)
+{
+#ifdef FEAT_TUI
+ UI_CALL(after_startup);
+#endif
+}
+
void ui_builtin_stop(void)
{
UI_CALL(stop);
diff --git a/src/nvim/ui.h b/src/nvim/ui.h
index f1ea0716e6..84d17e9ec2 100644
--- a/src/nvim/ui.h
+++ b/src/nvim/ui.h
@@ -31,13 +31,12 @@ struct ui_t {
bool ui_ext[UI_WIDGETS]; ///< Externalized widgets
int width, height;
void *data;
-
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ui_events.generated.h"
#endif
-
void (*event)(UI *ui, char *name, Array args, bool *args_consumed);
void (*stop)(UI *ui);
+ void (*after_startup)(UI *ui);
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/ui_bridge.c b/src/nvim/ui_bridge.c
index 0a69cf0ecb..324d821df5 100644
--- a/src/nvim/ui_bridge.c
+++ b/src/nvim/ui_bridge.c
@@ -42,6 +42,7 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler)
rv->ui = ui;
rv->bridge.rgb = ui->rgb;
rv->bridge.stop = ui_bridge_stop;
+ rv->bridge.after_startup = ui_bridge_after_startup;
rv->bridge.resize = ui_bridge_resize;
rv->bridge.clear = ui_bridge_clear;
rv->bridge.eol_clear = ui_bridge_eol_clear;
@@ -106,6 +107,16 @@ static void ui_thread_run(void *data)
bridge->ui_main(bridge, bridge->ui);
}
+static void ui_bridge_after_startup(UI *b)
+{
+ UI_BRIDGE_CALL(b, after_startup, 1, b);
+}
+static void ui_bridge_after_startup_event(void **argv)
+{
+ UI *ui = UI(argv[0]);
+ ui->after_startup(ui);
+}
+
static void ui_bridge_stop(UI *b)
{
UIBridgeData *bridge = (UIBridgeData *)b;