aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-11-17 22:13:30 +0800
committerGitHub <noreply@github.com>2023-11-17 22:13:30 +0800
commitad867fee26c8124d23693823b56f849e4487b828 (patch)
tree9b8b0f15803cd33550b0ac6bf3a2109a3b14ba1d
parent677be4bdd224f25519d9072a923d2c707842c6ad (diff)
downloadrneovim-ad867fee26c8124d23693823b56f849e4487b828.tar.gz
rneovim-ad867fee26c8124d23693823b56f849e4487b828.tar.bz2
rneovim-ad867fee26c8124d23693823b56f849e4487b828.zip
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.
-rw-r--r--src/nvim/tui/tui.c19
-rw-r--r--test/functional/terminal/tui_spec.lua25
2 files changed, 34 insertions, 10 deletions
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;
}
}
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 960870fb46..b17eed00f9 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -1785,6 +1785,31 @@ describe('TUI', function()
{3:-- TERMINAL --} |
]])
end)
+
+ it('supports hiding cursor', function()
+ child_session:request('nvim_command',
+ "let g:id = jobstart([v:progpath, '--clean', '--headless'])")
+ feed_data(':call jobwait([g:id])\n')
+ screen:expect([[
+ |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
+ :call jobwait([g:id]) |
+ {3:-- TERMINAL --} |
+ ]])
+ feed_data('\003')
+ screen:expect([[
+ {1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
+ Type :qa and press <Enter> to exit Nvim |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
end)
describe('TUI', function()