diff options
author | Thomas Adam <thomas@xteddy.org> | 2021-03-12 10:01:18 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2021-03-12 10:01:18 +0000 |
commit | 7019937b52488a726b85c5cdfc4616532fd620d1 (patch) | |
tree | 65fc24a23e3ca588089f088db10d35266e530b53 | |
parent | ef9700816fd2bd521bab837ccd85e0a596aa3aa8 (diff) | |
parent | e8224fb0d123ca9042b0703a35e1a33f0787d327 (diff) | |
download | rtmux-7019937b52488a726b85c5cdfc4616532fd620d1.tar.gz rtmux-7019937b52488a726b85c5cdfc4616532fd620d1.tar.bz2 rtmux-7019937b52488a726b85c5cdfc4616532fd620d1.zip |
Merge branch 'obsd-master' into master
-rw-r--r-- | screen.c | 4 | ||||
-rw-r--r-- | tty.c | 38 |
2 files changed, 28 insertions, 14 deletions
@@ -153,8 +153,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. */ @@ -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)) { /* |