aboutsummaryrefslogtreecommitdiff
path: root/test/functional/terminal/cursor_spec.lua
diff options
context:
space:
mode:
authorSean Dewar <6256228+seandewar@users.noreply.github.com>2025-02-15 17:25:48 +0000
committerGitHub <noreply@github.com>2025-02-15 17:25:48 +0000
commita49f95d887a2425f11cb4a9b38f7b0039e4d837f (patch)
tree0110f0b5315207906bc6556a9a1b47f146cd4d89 /test/functional/terminal/cursor_spec.lua
parent8e4b77134a1cbc08b7372b6834eafc7cecdbc33e (diff)
downloadrneovim-a49f95d887a2425f11cb4a9b38f7b0039e4d837f.tar.gz
rneovim-a49f95d887a2425f11cb4a9b38f7b0039e4d837f.tar.bz2
rneovim-a49f95d887a2425f11cb4a9b38f7b0039e4d837f.zip
fix(terminal): avoid mismatched `busy_start` without `busy_stop` (#32458)
Problem: `showmode` in `terminal_enter` may cause `vpeekc` to process events, which may handle pending escape sequences. If `CSI ? 25 l` is handled to hide the cursor, it may remain hidden even after leaving terminal mode if both `terminal_enter` and (indirectly) `showmode` call `ui_busy_start`, as there is only one matching call to `ui_busy_stop` after leaving terminal mode. Solution: let `terminal_enter` handle setting the initial visibility of the cursor before calling `showmode`. Closes #32456. This simple solution assumes it isn't possible for e.g. `os_breakcheck` to be called indirectly by something else before `terminal_enter` initially handles cursor visibility and after it restores it, which I think is true.
Diffstat (limited to 'test/functional/terminal/cursor_spec.lua')
-rw-r--r--test/functional/terminal/cursor_spec.lua26
1 files changed, 26 insertions, 0 deletions
diff --git a/test/functional/terminal/cursor_spec.lua b/test/functional/terminal/cursor_spec.lua
index 83408e41b3..a824893ce3 100644
--- a/test/functional/terminal/cursor_spec.lua
+++ b/test/functional/terminal/cursor_spec.lua
@@ -357,6 +357,32 @@ describe(':terminal cursor', function()
eq(error_hl_id, screen._mode_info[terminal_mode_idx].hl_id)
end)
+
+ it('restores visibility on TermLeave #32456', function()
+ skip(is_os('win'), '#31587')
+ feed([[<C-\><C-N>]]) -- Exit terminal mode
+ screen:expect([[
+ tty ready |
+ ^ |
+ |*5
+ ]])
+
+ tt.hide_cursor()
+ -- :startinsert repros the issue more reliably than feed('i')
+ command('mode | startinsert')
+ screen:expect([[
+ tty ready |
+ |*5
+ {3:-- TERMINAL --} |
+ ]])
+
+ feed([[<C-\><C-N>]]) -- Exit terminal mode
+ screen:expect([[
+ tty ready |
+ ^ |
+ |*5
+ ]])
+ end)
end)
describe('buffer cursor position is correct in terminal without number column', function()