From 9d3019104c37bad56ff5bdc7614b26cb3fea7ce4 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sun, 3 May 2026 18:37:05 +0000 Subject: [PATCH] patch 9.2.0437: MS-Windows: cursor flicker in vtp mode Problem: MS-Windows: cursor flicker in vtp mode Solution: Skip mch_update_cursor() in cursor_visible() when vtp is active (Yasuhiro Matsumoto). In vtp (ConPTY) mode the cursor visibility is controlled by DECTCEM (\033[?25h / \033[?25l). The follow-up call to mch_update_cursor() then re-emits DECSCUSR (\033[0 q etc.) on every visibility toggle even though the cursor shape did not change. Some terminals briefly redisplay the cursor when DECSCUSR arrives, so this can cause a visible flash at the position the cursor will be moved to next (e.g. column 0 ahead of a line redraw). In non-vtp mode the call is still required because SetConsoleCursorInfo() inside mch_set_cursor_shape() reads s_cursor_visible to apply the visibility change, so keep that path unchanged. closes: #20122 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/os_win32.c | 10 ++++++++++ src/version.c | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/os_win32.c b/src/os_win32.c index e8f8162f1b..ab12d5a051 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -7104,9 +7104,19 @@ cursor_visible(BOOL fVisible) s_cursor_visible = fVisible; if (vtp_working) + { + // In vtp mode, visibility is controlled solely by DECTCEM. Skip + // mch_update_cursor() since shape is independent of visibility and + // re-emitting DECSCUSR can cause the terminal to briefly redisplay + // the cursor while a redraw is in progress. vtp_printf("\033[?25%c", fVisible ? 'h' : 'l'); + return; + } # ifdef MCH_CURSOR_SHAPE + // Non-vtp Windows console: SetConsoleCursorInfo() consults + // s_cursor_visible inside mch_set_cursor_shape(), so the call is needed + // to apply the new visibility. mch_update_cursor(); # endif } diff --git a/src/version.c b/src/version.c index f377ae58ee..597842bf9c 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 437, /**/ 436, /**/