Problem: MS-Windows: cursor flicker during update_screen()
Solution: Hide the cursor during update_screen() to avoid Windows ConPTY
flicker (Yasuhiro Matsumoto).
On terminals that do not honor synchronized output mode (e.g. Windows
ConPTY), update_screen() emits cell positioning and content as multiple
Win32 console writes through mch_write(), which the terminal renders as
separate frames. This shows up as the cursor briefly jumping to column
1 of rows being redrawn, especially during async redraws around the
popup completion menu.
Disable the cursor with cursor_off() at the start of update_screen()
and restore it with cursor_on() at the end, but only when synchronized
output mode is not active. When it is, the redraw is already atomic
from the terminal's view and hiding the cursor would only add visible
blink with no benefit.
closes: #20121
Signed-off-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
}
updating_screen = TRUE;
+ // Hide the cursor while redrawing when sync output is not active, to
+ // avoid visible cursor flicker on terminals like Windows ConPTY.
+ int hid_cursor = !sync_output_active();
+ if (hid_cursor)
+ cursor_off();
term_set_sync_output(TERM_SYNC_OUTPUT_ENABLE);
#ifdef FEAT_PROP_POPUP
#endif
term_set_sync_output(TERM_SYNC_OUTPUT_DISABLE);
+ if (hid_cursor)
+ cursor_on();
return OK;
}
int term_replace_keycodes(char_u *ta_buf, int ta_len, int len_arg);
void term_disable_dec(void);
void term_set_win_resize(bool state);
+int sync_output_active(void);
void term_set_sync_output(int flags);
/* vim: set ft=c : */
}
#endif
+ int
+sync_output_active(void)
+{
+#ifdef FEAT_GUI
+ if (gui.in_use)
+ return TRUE;
+#endif
+ return p_tsy && (sync_output_setting == 1 || sync_output_setting == 2)
+ && *T_BSU != NUL && *T_ESU != NUL;
+}
+
/*
* Enable or disable synchronized output if possible. Specification can be found
* here:
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 440,
/**/
439,
/**/