patch 8.0.0973: initial info about blinking cursor is wrong
Problem: initial info about blinking cursor is wrong
Solution: Invert the blink flag. Add t_VS to stop a blinking cursor.
diff --git a/src/term.c b/src/term.c
index 44b196f..6de4522 100644
--- a/src/term.c
+++ b/src/term.c
@@ -828,17 +828,13 @@
{(int)KS_LE, "\b"},
{(int)KS_VI, IF_EB("\033[?25l", ESC_STR "[?25l")},
{(int)KS_VE, IF_EB("\033[?25h", ESC_STR "[?25h")},
-#if 0
- /* This is currently disabled, because we cannot reliably restore the
- * cursor style because of what appears to be an xterm bug. */
- {(int)KS_VE, IF_EB("\033[?25h\033[?12l", ESC_STR "[?25h" ESC_STR "[?12l")},
{(int)KS_VS, IF_EB("\033[?12h", ESC_STR "[?12h")},
+ {(int)KS_CVS, IF_EB("\033[?12l", ESC_STR "[?12l")},
# ifdef TERMINFO
{(int)KS_CSH, IF_EB("\033[%p1%d q", ESC_STR "[%p1%d q")},
# else
{(int)KS_CSH, IF_EB("\033[%d q", ESC_STR "[%d q")},
# endif
-#endif
{(int)KS_CRS, IF_EB("\033P$q q\033\\", ESC_STR "P$q q" ESC_STR "\\")},
# ifdef TERMINFO
{(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH",
@@ -1585,7 +1581,7 @@
{KS_DL, "dl"}, {KS_CDL,"DL"}, {KS_CS, "cs"},
{KS_CL, "cl"}, {KS_CD, "cd"},
{KS_VI, "vi"}, {KS_VE, "ve"}, {KS_MB, "mb"},
- {KS_VS, "vs"}, {KS_ME, "me"}, {KS_MR, "mr"},
+ {KS_ME, "me"}, {KS_MR, "mr"},
{KS_MD, "md"}, {KS_SE, "se"}, {KS_SO, "so"},
{KS_CZH,"ZH"}, {KS_CZR,"ZR"}, {KS_UE, "ue"},
{KS_US, "us"}, {KS_UCE, "Ce"}, {KS_UCS, "Cs"},
@@ -1595,6 +1591,7 @@
{KS_BC, "bc"}, {KS_CSB,"Sb"}, {KS_CSF,"Sf"},
{KS_CAB,"AB"}, {KS_CAF,"AF"}, {KS_LE, "le"},
{KS_ND, "nd"}, {KS_OP, "op"}, {KS_CRV, "RV"},
+ {KS_VS, "vs"}, {KS_CVS, "VS"},
{KS_CIS, "IS"}, {KS_CIE, "IE"},
{KS_CSC, "SC"}, {KS_CEC, "EC"},
{KS_TS, "ts"}, {KS_FS, "fs"},
@@ -3665,11 +3662,11 @@
void
scroll_start(void)
{
- if (*T_VS != NUL)
+ if (*T_VS != NUL && *T_CVS != NUL)
{
out_str(T_VS);
- out_str(T_VE);
- screen_start(); /* don't know where cursor is now */
+ out_str(T_CVS);
+ screen_start(); /* don't know where cursor is now */
}
}
@@ -3694,10 +3691,9 @@
void
cursor_off(void)
{
- if (full_screen)
+ if (full_screen && !cursor_is_off)
{
- if (!cursor_is_off)
- out_str(T_VI); /* disable cursor */
+ out_str(T_VI); /* disable cursor */
cursor_is_off = TRUE;
}
}
@@ -3766,20 +3762,10 @@
out_flush();
}
}
-
- void
-term_cursor_blink(int blink)
-{
- if (blink)
- out_str(T_VS);
- else
- out_str(T_VE);
- out_flush();
-}
# endif
/*
- * "shape" == 1: block, "shape" == 2: underline, "shape" == 3: vertical bar
+ * "shape": 1 = block, 2 = underline, 3 = vertical bar
*/
void
term_cursor_shape(int shape, int blink)
@@ -3789,6 +3775,17 @@
OUT_STR(tgoto((char *)T_CSH, 0, shape * 2 - blink));
out_flush();
}
+ /* When t_SH is not set try setting just the blink state. */
+ else if (blink && *T_VS != NUL)
+ {
+ out_str(T_VS);
+ out_flush();
+ }
+ else if (!blink && *T_CVS != NUL)
+ {
+ out_str(T_CVS);
+ out_flush();
+ }
}
#endif
@@ -4693,7 +4690,9 @@
* 5 = vertical bar blink, 6 = vertical bar */
number = number == 0 ? 1 : number;
initial_cursor_shape = (number + 1) / 2;
- initial_cursor_blink = (number & 1) ? TRUE : FALSE;
+ /* The blink flag is actually inverted, compared to
+ * the value set with T_SH. */
+ initial_cursor_blink = (number & 1) ? FALSE : TRUE;
rcm_status = STATUS_GOT;
LOG_TR("Received cursor shape response");