diff options
author | nicm <nicm> | 2021-03-12 08:39:17 +0000 |
---|---|---|
committer | nicm <nicm> | 2021-03-12 08:39:17 +0000 |
commit | e8224fb0d123ca9042b0703a35e1a33f0787d327 (patch) | |
tree | 2b51e29110d03fad9e2662819eda3be1909a32f6 /tty.c | |
parent | ee0df1b8f8a9099fbd67a73c9fb20b89c64d6106 (diff) | |
download | rtmux-e8224fb0d123ca9042b0703a35e1a33f0787d327.tar.gz rtmux-e8224fb0d123ca9042b0703a35e1a33f0787d327.tar.bz2 rtmux-e8224fb0d123ca9042b0703a35e1a33f0787d327.zip |
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.
Diffstat (limited to 'tty.c')
-rw-r--r-- | tty.c | 38 |
1 files changed, 25 insertions, 13 deletions
@@ -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)) { /* |