From a49f95d887a2425f11cb4a9b38f7b0039e4d837f Mon Sep 17 00:00:00 2001 From: Sean Dewar <6256228+seandewar@users.noreply.github.com> Date: Sat, 15 Feb 2025 17:25:48 +0000 Subject: 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. --- src/nvim/terminal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 959126dd24..61b55f71de 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -693,7 +693,6 @@ bool terminal_enter(void) refresh_cursor(s->term); adjust_topline(s->term, buf, 0); // scroll to end - showmode(); curwin->w_redr_status = true; // For mode() in statusline. #8323 redraw_custom_title_later(); if (!s->term->cursor.visible) { @@ -701,6 +700,7 @@ bool terminal_enter(void) ui_busy_start(); } ui_cursor_shape(); + showmode(); apply_autocmds(EVENT_TERMENTER, NULL, NULL, false, curbuf); may_trigger_modechanged(); -- cgit