summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2021-03-12 08:39:17 +0000
committernicm <nicm>2021-03-12 08:39:17 +0000
commite8224fb0d123ca9042b0703a35e1a33f0787d327 (patch)
tree2b51e29110d03fad9e2662819eda3be1909a32f6
parentee0df1b8f8a9099fbd67a73c9fb20b89c64d6106 (diff)
Fix so tmux correctly sends the cvvis (cursor very visible) capability
rather than sending it and then immediately undoing it with cnorm. Also turn it off when the cursor shape is changed like xterm.
-rw-r--r--screen.c4
-rw-r--r--tty.c38
2 files changed, 28 insertions, 14 deletions
diff --git a/screen.c b/screen.c
index 2cdbec62..97ccdeec 100644
--- a/screen.c
+++ b/screen.c
@@ -154,8 +154,10 @@ screen_reset_tabs(struct screen *s)
void
screen_set_cursor_style(struct screen *s, u_int style)
{
- if (style <= 6)
+ if (style <= 6) {
s->cstyle = style;
+ s->mode &= ~MODE_BLINKING;
+ }
}
/* Set screen cursor colour. */
diff --git a/tty.c b/tty.c
index 399bbae8..e8a8cbaa 100644
--- a/tty.c
+++ b/tty.c
@@ -670,19 +670,10 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
if (changed != 0)
log_debug("%s: update mode %x to %x", c->name, tty->mode, mode);
- if (changed & MODE_BLINKING) {
- if (tty_term_has(tty->term, TTYC_CVVIS))
- tty_putcode(tty, TTYC_CVVIS);
- else
- tty_putcode(tty, TTYC_CNORM);
- changed |= MODE_CURSOR;
- }
- if (changed & MODE_CURSOR) {
- if (mode & MODE_CURSOR)
- tty_putcode(tty, TTYC_CNORM);
- else
- tty_putcode(tty, TTYC_CIVIS);
- }
+ /*
+ * The cursor blinking flag can be reset by setting the cursor style, so
+ * set the style first.
+ */
if (s != NULL && tty->cstyle != s->cstyle) {
if (tty_term_has(tty->term, TTYC_SS)) {
if (s->cstyle == 0 && tty_term_has(tty->term, TTYC_SE))
@@ -691,7 +682,28 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
tty_putcode1(tty, TTYC_SS, s->cstyle);
}
tty->cstyle = s->cstyle;
+ changed |= (MODE_CURSOR|MODE_BLINKING);
}
+
+ /*
+ * Cursor invisible (RM ?25) overrides cursor blinking (SM ?12 or RM
+ * 34), and we need to be careful not send cnorm after cvvis since it
+ * can undo it.
+ */
+ if (changed & (MODE_CURSOR|MODE_BLINKING)) {
+ log_debug("%s: cursor %s, %sblinking", __func__,
+ (mode & MODE_CURSOR) ? "on" : "off",
+ (mode & MODE_BLINKING) ? "" : "not ");
+ if (~mode & MODE_CURSOR)
+ tty_putcode(tty, TTYC_CIVIS);
+ else if (mode & MODE_BLINKING) {
+ tty_putcode(tty, TTYC_CNORM);
+ if (tty_term_has(tty->term, TTYC_CVVIS))
+ tty_putcode(tty, TTYC_CVVIS);
+ } else
+ tty_putcode(tty, TTYC_CNORM);
+ }
+
if ((changed & ALL_MOUSE_MODES) &&
tty_term_has(tty->term, TTYC_KMOUS)) {
/*