From ad867fee26c8124d23693823b56f849e4487b828 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 17 Nov 2023 22:13:30 +0800 Subject: fix(tui): handle cursor visibility properly (#26091) The test is for the case without 'termsync' because libvterm doesn't support synchronized output, and it passes without this PR. --- src/nvim/tui/tui.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index ad82b0d783..a64f9af454 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -1158,14 +1158,6 @@ void tui_set_mode(TUIData *tui, ModeShape mode) unibi_out_ext(tui, tui->unibi_ext.reset_cursor_color); } - if (tui->want_invisible && !tui->is_invisible) { - unibi_out(tui, unibi_cursor_invisible); - tui->is_invisible = true; - } else if (!tui->want_invisible && tui->is_invisible) { - unibi_out(tui, unibi_cursor_normal); - tui->is_invisible = false; - } - int shape; switch (c.shape) { case SHAPE_BLOCK: @@ -1305,8 +1297,9 @@ static void tui_flush_start(TUIData *tui) if (tui->sync_output && tui->unibi_ext.sync != -1) { UNIBI_SET_NUM_VAR(tui->params[0], 1); unibi_out_ext(tui, tui->unibi_ext.sync); - } else { + } else if (!tui->is_invisible) { unibi_out(tui, unibi_cursor_invisible); + tui->is_invisible = true; } } @@ -1318,8 +1311,14 @@ static void tui_flush_end(TUIData *tui) if (tui->sync_output && tui->unibi_ext.sync != -1) { UNIBI_SET_NUM_VAR(tui->params[0], 0); unibi_out_ext(tui, tui->unibi_ext.sync); - } else if (!tui->busy && !tui->want_invisible) { + } + bool should_invisible = tui->busy || tui->want_invisible; + if (tui->is_invisible && !should_invisible) { unibi_out(tui, unibi_cursor_normal); + tui->is_invisible = false; + } else if (!tui->is_invisible && should_invisible) { + unibi_out(tui, unibi_cursor_invisible); + tui->is_invisible = true; } } -- cgit