summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2015-01-20 08:18:04 +0000
committernicm <nicm>2015-01-20 08:18:04 +0000
commit16bdd970dcc68e50f26c512b3ead628b9b899c88 (patch)
tree62d7c4b928766cfc532ab197adf4482116439d1b
parentd45150267656530b8503375555a1814fcfe6a15a (diff)
Support blinking cursor mode, both the xterm CSI ?12 h/l and (the
backwards) screen CSI 34 h/l. From Guanpeng Xu.
-rw-r--r--input.c12
-rw-r--r--tmux.h3
-rw-r--r--tty-term.c1
-rw-r--r--tty.c12
4 files changed, 23 insertions, 5 deletions
diff --git a/input.c b/input.c
index fcc91180..de11f629 100644
--- a/input.c
+++ b/input.c
@@ -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;
diff --git a/tmux.h b/tmux.h
index aff664c0..c73b59ca 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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
diff --git a/tty-term.c b/tty-term.c
index f866a2d8..c8a6ba8b 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -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" },
diff --git a/tty.c b/tty.c
index 9f57c365..2ff2fccc 100644
--- a/tty.c
+++ b/tty.c
@@ -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) {