diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2017-12-11 23:05:36 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-12-13 22:17:39 +0100 |
commit | 6b51c72e0cc99c6c03c521f77793028cf63afd45 (patch) | |
tree | 8d99fc28882dca17d57cabdbf0158d24d9a1883b | |
parent | 6203c23449cfdf8fb09c33d3ab267703d57123fa (diff) | |
download | rneovim-6b51c72e0cc99c6c03c521f77793028cf63afd45.tar.gz rneovim-6b51c72e0cc99c6c03c521f77793028cf63afd45.tar.bz2 rneovim-6b51c72e0cc99c6c03c521f77793028cf63afd45.zip |
tui: rework deferred-termcodes implementation
Try another approach to defer the termcodes. Seems less janky, but still
not perfect.
ref #7664
ref #7649
ref #7664
ref 27f9b1c7b029d8
-rw-r--r-- | src/nvim/main.c | 3 | ||||
-rw-r--r-- | src/nvim/tui/tui.c | 15 | ||||
-rw-r--r-- | src/nvim/ui.c | 8 | ||||
-rw-r--r-- | src/nvim/ui.h | 3 | ||||
-rw-r--r-- | src/nvim/ui_bridge.c | 11 |
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; |