=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/tty.c,v retrieving revision 1.403 retrieving revision 1.404 diff -c -r1.403 -r1.404 *** src/usr.bin/tmux/tty.c 2021/08/17 11:20:13 1.403 --- src/usr.bin/tmux/tty.c 2021/10/05 12:46:02 1.404 *************** *** 1,4 **** ! /* $OpenBSD: tty.c,v 1.403 2021/08/17 11:20:13 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: tty.c,v 1.404 2021/10/05 12:46:02 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 314,320 **** tio.c_cc[VMIN] = 1; tio.c_cc[VTIME] = 0; if (tcsetattr(c->fd, TCSANOW, &tio) == 0) ! tcflush(c->fd, TCIOFLUSH); tty_putcode(tty, TTYC_SMCUP); --- 314,320 ---- tio.c_cc[VMIN] = 1; tio.c_cc[VTIME] = 0; if (tcsetattr(c->fd, TCSANOW, &tio) == 0) ! tcflush(c->fd, TCOFLUSH); tty_putcode(tty, TTYC_SMCUP); *************** *** 658,669 **** tty->ccolour = xstrdup(ccolour); } void tty_update_mode(struct tty *tty, int mode, struct screen *s) { ! struct client *c = tty->client; ! int changed; ! enum screen_cursor_style cstyle = tty->cstyle; if (tty->flags & TTY_NOCURSOR) mode &= ~MODE_CURSOR; --- 658,740 ---- tty->ccolour = xstrdup(ccolour); } + static void + tty_update_cursor(struct tty *tty, int mode, int changed, struct screen *s) + { + enum screen_cursor_style cstyle; + + /* Set cursor colour if changed. */ + if (s != NULL && strcmp(s->ccolour, tty->ccolour) != 0) + tty_force_cursor_colour(tty, s->ccolour); + + /* If cursor is off, set as invisible. */ + if (~mode & MODE_CURSOR) { + if (changed & MODE_CURSOR) + tty_putcode(tty, TTYC_CIVIS); + return; + } + + /* Check if blinking or very visible flag changed or style changed. */ + if (s == NULL) + cstyle = tty->cstyle; + else + cstyle = s->cstyle; + if ((changed & CURSOR_MODES) == 0 && cstyle == tty->cstyle) + return; + + /* + * Set cursor style. If an explicit style has been set with DECSCUSR, + * set it if supported, otherwise send cvvis for blinking styles. + * + * If no style, has been set (SCREEN_CURSOR_DEFAULT), then send cvvis + * if either the blinking or very visible flags are set. + */ + tty_putcode(tty, TTYC_CNORM); + switch (cstyle) { + case SCREEN_CURSOR_DEFAULT: + if (tty_term_has(tty->term, TTYC_SE)) + tty_putcode(tty, TTYC_SE); + else + tty_putcode1(tty, TTYC_SS, 0); + if (mode & (MODE_CURSOR_BLINKING|MODE_CURSOR_VERY_VISIBLE)) + tty_putcode(tty, TTYC_CVVIS); + break; + case SCREEN_CURSOR_BLOCK: + if (tty_term_has(tty->term, TTYC_SS)) { + if (mode & MODE_CURSOR_BLINKING) + tty_putcode1(tty, TTYC_SS, 1); + else + tty_putcode1(tty, TTYC_SS, 2); + } else if (mode & MODE_CURSOR_BLINKING) + tty_putcode(tty, TTYC_CVVIS); + break; + case SCREEN_CURSOR_UNDERLINE: + if (tty_term_has(tty->term, TTYC_SS)) { + if (mode & MODE_CURSOR_BLINKING) + tty_putcode1(tty, TTYC_SS, 3); + else + tty_putcode1(tty, TTYC_SS, 4); + } else if (mode & MODE_CURSOR_BLINKING) + tty_putcode(tty, TTYC_CVVIS); + break; + case SCREEN_CURSOR_BAR: + if (tty_term_has(tty->term, TTYC_SS)) { + if (mode & MODE_CURSOR_BLINKING) + tty_putcode1(tty, TTYC_SS, 5); + else + tty_putcode1(tty, TTYC_SS, 6); + } else if (mode & MODE_CURSOR_BLINKING) + tty_putcode(tty, TTYC_CVVIS); + break; + } + tty->cstyle = cstyle; + } + void tty_update_mode(struct tty *tty, int mode, struct screen *s) { ! struct client *c = tty->client; ! int changed; if (tty->flags & TTY_NOCURSOR) mode &= ~MODE_CURSOR; *************** *** 676,760 **** screen_mode_to_string(mode)); } ! if (s != NULL) { ! if (strcmp(s->ccolour, tty->ccolour) != 0) ! tty_force_cursor_colour(tty, s->ccolour); ! cstyle = s->cstyle; ! } ! if (~mode & MODE_CURSOR) { ! /* Cursor now off - set as invisible. */ ! if (changed & MODE_CURSOR) ! tty_putcode(tty, TTYC_CIVIS); ! } else if ((changed & (MODE_CURSOR|MODE_BLINKING)) || ! cstyle != tty->cstyle) { ! /* ! * Cursor now on, blinking flag changed or style changed. Start ! * by setting the cursor to normal. ! */ ! tty_putcode(tty, TTYC_CNORM); ! switch (cstyle) { ! case SCREEN_CURSOR_DEFAULT: ! /* ! * If the old style wasn't default, then reset it to ! * default. ! */ ! if (tty->cstyle != SCREEN_CURSOR_DEFAULT) { ! if (tty_term_has(tty->term, TTYC_SE)) ! tty_putcode(tty, TTYC_SE); ! else ! tty_putcode1(tty, TTYC_SS, 0); ! } ! ! /* Set the cursor as very visible if necessary. */ ! if (mode & MODE_BLINKING) ! tty_putcode(tty, TTYC_CVVIS); ! break; ! case SCREEN_CURSOR_BLOCK: ! /* ! * Set style to either block blinking (1) or steady (2) ! * if supported, otherwise just check the blinking ! * flag. ! */ ! if (tty_term_has(tty->term, TTYC_SS)) { ! if (mode & MODE_BLINKING) ! tty_putcode1(tty, TTYC_SS, 1); ! else ! tty_putcode1(tty, TTYC_SS, 2); ! } else if (mode & MODE_BLINKING) ! tty_putcode(tty, TTYC_CVVIS); ! break; ! case SCREEN_CURSOR_UNDERLINE: ! /* ! * Set style to either underline blinking (3) or steady ! * (4) if supported, otherwise just check the blinking ! * flag. ! */ ! if (tty_term_has(tty->term, TTYC_SS)) { ! if (mode & MODE_BLINKING) ! tty_putcode1(tty, TTYC_SS, 3); ! else ! tty_putcode1(tty, TTYC_SS, 4); ! } else if (mode & MODE_BLINKING) ! tty_putcode(tty, TTYC_CVVIS); ! break; ! case SCREEN_CURSOR_BAR: ! /* ! * Set style to either bar blinking (5) or steady (6) ! * if supported, otherwise just check the blinking ! * flag. ! */ ! if (tty_term_has(tty->term, TTYC_SS)) { ! if (mode & MODE_BLINKING) ! tty_putcode1(tty, TTYC_SS, 5); ! else ! tty_putcode1(tty, TTYC_SS, 6); ! } else if (mode & MODE_BLINKING) ! tty_putcode(tty, TTYC_CVVIS); ! break; ! } ! tty->cstyle = cstyle; ! } ! if ((changed & ALL_MOUSE_MODES) && tty_term_has(tty->term, TTYC_KMOUS)) { /* --- 747,753 ---- screen_mode_to_string(mode)); } ! tty_update_cursor(tty, mode, changed, s); if ((changed & ALL_MOUSE_MODES) && tty_term_has(tty->term, TTYC_KMOUS)) { /*