paste: tickle cursor

HACK: The cursor does not get repositioned after the paste completes.
Scheduling a dummy event seems to fix it.

Test case:
0. Revert this commit.
1. Paste some text in Normal-mode.
2. Notice the cursor is still in the cmdline area.
This commit is contained in:
Justin M. Keyes 2019-08-26 03:15:09 +02:00
parent 5b41070c63
commit 4344ac1111
3 changed files with 11 additions and 7 deletions

View File

@ -1252,11 +1252,15 @@ Boolean nvim_paste(String data, Integer phase, Error *err)
} }
} }
} }
api_free_object(rv);
api_free_array(args);
if (!(State & CMDLINE) && !(State & INSERT) && (phase == -1 || phase == 3)) { if (!(State & CMDLINE) && !(State & INSERT) && (phase == -1 || phase == 3)) {
AppendCharToRedobuff(ESC); // Dot-repeat. AppendCharToRedobuff(ESC); // Dot-repeat.
} }
api_free_object(rv); if (phase == -1 || phase == 3) {
api_free_array(args); // XXX: Tickle main loop to ensure cursor is updated.
loop_schedule_deferred(&main_loop, event_create(loop_dummy_event, 0));
}
return ok; return ok;
} }

View File

@ -162,6 +162,10 @@ size_t loop_size(Loop *loop)
return rv; return rv;
} }
void loop_dummy_event(void **argv)
{
}
static void async_cb(uv_async_t *handle) static void async_cb(uv_async_t *handle)
{ {
Loop *l = handle->loop->data; Loop *l = handle->loop->data;

View File

@ -430,7 +430,7 @@ static void tui_main(UIBridgeData *bridge, UI *ui)
tui_terminal_after_startup(ui); tui_terminal_after_startup(ui);
// Tickle `main_loop` with a dummy event, else the initial "focus-gained" // Tickle `main_loop` with a dummy event, else the initial "focus-gained"
// terminal response may not get processed until user hits a key. // terminal response may not get processed until user hits a key.
loop_schedule_deferred(&main_loop, event_create(tui_dummy_event, 0)); loop_schedule_deferred(&main_loop, event_create(loop_dummy_event, 0));
} }
// "Passive" (I/O-driven) loop: TUI thread "main loop". // "Passive" (I/O-driven) loop: TUI thread "main loop".
while (!tui_is_stopped(ui)) { while (!tui_is_stopped(ui)) {
@ -449,10 +449,6 @@ static void tui_main(UIBridgeData *bridge, UI *ui)
xfree(data); xfree(data);
} }
static void tui_dummy_event(void **argv)
{
}
/// Handoff point between the main (ui_bridge) thread and the TUI thread. /// Handoff point between the main (ui_bridge) thread and the TUI thread.
static void tui_scheduler(Event event, void *d) static void tui_scheduler(Event event, void *d)
{ {