Support blinking cursor mode, both the xterm CSI ?12 h/l and (the

backwards) screen CSI 34 h/l. From Guanpeng Xu.
This commit is contained in:
nicm 2015-01-20 08:18:04 +00:00
parent d451502676
commit 16bdd970dc
4 changed files with 23 additions and 5 deletions

12
input.c
View File

@ -1342,6 +1342,9 @@ input_csi_dispatch_rm(struct input_ctx *ictx)
case 4: /* IRM */
screen_write_mode_clear(&ictx->ctx, MODE_INSERT);
break;
case 34:
screen_write_mode_set(&ictx->ctx, MODE_BLINKING);
break;
default:
log_debug("%s: unknown '%c'", __func__, ictx->ch);
break;
@ -1368,6 +1371,9 @@ input_csi_dispatch_rm_private(struct input_ctx *ictx)
case 7: /* DECAWM */
screen_write_mode_clear(&ictx->ctx, MODE_WRAP);
break;
case 12:
screen_write_mode_clear(&ictx->ctx, MODE_BLINKING);
break;
case 25: /* TCEM */
screen_write_mode_clear(&ictx->ctx, MODE_CURSOR);
break;
@ -1413,6 +1419,9 @@ input_csi_dispatch_sm(struct input_ctx *ictx)
case 4: /* IRM */
screen_write_mode_set(&ictx->ctx, MODE_INSERT);
break;
case 34:
screen_write_mode_clear(&ictx->ctx, MODE_BLINKING);
break;
default:
log_debug("%s: unknown '%c'", __func__, ictx->ch);
break;
@ -1439,6 +1448,9 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
case 7: /* DECAWM */
screen_write_mode_set(&ictx->ctx, MODE_WRAP);
break;
case 12:
screen_write_mode_set(&ictx->ctx, MODE_BLINKING);
break;
case 25: /* TCEM */
screen_write_mode_set(&ictx->ctx, MODE_CURSOR);
break;

3
tmux.h
View File

@ -175,6 +175,7 @@ enum tty_code_code {
TTYC_CUP, /* cursor_address, cm */
TTYC_CUU, /* parm_up_cursor, UP */
TTYC_CUU1, /* cursor_up, up */
TTYC_CVVIS, /* cursor_visible, vs */
TTYC_DCH, /* parm_dch, DC */
TTYC_DCH1, /* delete_character, dc */
TTYC_DIM, /* enter_dim_mode, mh */
@ -600,7 +601,7 @@ struct mode_key_table {
#define MODE_WRAP 0x10 /* whether lines wrap */
#define MODE_MOUSE_STANDARD 0x20
#define MODE_MOUSE_BUTTON 0x40
/* 0x80 unused */
#define MODE_BLINKING 0x80
#define MODE_MOUSE_UTF8 0x100
#define MODE_MOUSE_SGR 0x200
#define MODE_BRACKETPASTE 0x400

View File

@ -54,6 +54,7 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_CUP, TTYCODE_STRING, "cup" },
{ TTYC_CUU, TTYCODE_STRING, "cuu" },
{ TTYC_CUU1, TTYCODE_STRING, "cuu1" },
{ TTYC_CVVIS, TTYCODE_STRING, "cvvis" },
{ TTYC_DCH, TTYCODE_STRING, "dch" },
{ TTYC_DCH1, TTYCODE_STRING, "dch1" },
{ TTYC_DIM, TTYCODE_STRING, "dim" },

12
tty.c
View File

@ -482,10 +482,14 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
mode &= ~MODE_CURSOR;
changed = mode ^ tty->mode;
if (changed & MODE_CURSOR) {
if (mode & MODE_CURSOR)
tty_putcode(tty, TTYC_CNORM);
else
if (changed & (MODE_CURSOR|MODE_BLINKING)) {
if (mode & MODE_CURSOR) {
if (mode & MODE_BLINKING &&
tty_term_has(tty->term, TTYC_CVVIS))
tty_putcode(tty, TTYC_CVVIS);
else
tty_putcode(tty, TTYC_CNORM);
} else
tty_putcode(tty, TTYC_CIVIS);
}
if (tty->cstyle != s->cstyle) {