From b2f301f4e2b05764cd80da2ebc08e10605d0eeca Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Sun, 22 May 2011 16:26:09 +0000 Subject: [PATCH] Sync OpenBSD patchset 916: Support DECSCUSR sequence to set the cursor style with two new terminfo(5) extensions, Cs and Csr. Written by Ailin Nemui. --- input.c | 8 +++++++- options-table.c | 3 ++- screen.c | 11 ++++++++++- tmux.1 | 15 ++++++++++++++- tmux.h | 7 ++++++- tty-term.c | 4 +++- tty.c | 19 ++++++++++++++++++- 7 files changed, 60 insertions(+), 7 deletions(-) diff --git a/input.c b/input.c index 989f4757..934d70b4 100644 --- a/input.c +++ b/input.c @@ -1,4 +1,4 @@ -/* $Id: input.c,v 1.118 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: input.c,v 1.119 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -126,6 +126,7 @@ enum input_csi_type { INPUT_CSI_CUU, INPUT_CSI_DA, INPUT_CSI_DCH, + INPUT_CSI_DECSCUSR, INPUT_CSI_DECSTBM, INPUT_CSI_DL, INPUT_CSI_DSR, @@ -168,6 +169,7 @@ const struct input_table_entry input_csi_table[] = { { 'l', "?", INPUT_CSI_RM_PRIVATE }, { 'm', "", INPUT_CSI_SGR }, { 'n', "", INPUT_CSI_DSR }, + { 'q', " ", INPUT_CSI_DECSCUSR }, { 'r', "", INPUT_CSI_DECSTBM }, }; @@ -1259,6 +1261,10 @@ input_csi_dispatch(struct input_ctx *ictx) n = input_get(ictx, 0, 1, 1); screen_write_cursormove(sctx, s->cx, n - 1); break; + case INPUT_CSI_DECSCUSR: + n = input_get(ictx, 0, 0, 0); + screen_set_cursor_style(s, n); + break; } return (0); diff --git a/options-table.c b/options-table.c index 407ab6c1..e69b32ae 100644 --- a/options-table.c +++ b/options-table.c @@ -1,4 +1,4 @@ -/* $Id: options-table.c,v 1.11 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: options-table.c,v 1.12 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -367,6 +367,7 @@ const struct options_table_entry session_options_table[] = { .default_str = "*88col*:colors=88,*256col*:colors=256" ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007" ":Cc=\\E]12;%p1%s\\007:Cr=\\E]112\\007" + ":Cs=\\E[%p1%d q:Csr=\\E[2 q" }, { .name = "update-environment", diff --git a/screen.c b/screen.c index 07e0c33b..172ee439 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.105 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: screen.c,v 1.106 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -41,6 +41,7 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit) else s->title = xstrdup(""); + s->cstyle = 0; s->ccolour = xstrdup(""); s->tabs = NULL; @@ -92,6 +93,14 @@ screen_reset_tabs(struct screen *s) bit_set(s->tabs, i); } +/* Set screen cursor style. */ +void +screen_set_cursor_style(struct screen *s, u_int style) +{ + if (style <= 4) + s->cstyle = style; +} + /* Set screen cursor colour. */ void screen_set_cursor_colour(struct screen *s, const char *colour_string) diff --git a/tmux.1 b/tmux.1 index b4f51cb7..89829e96 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.315 2011-05-22 16:25:02 tcunha Exp $ +.\" $Id: tmux.1,v 1.316 2011-05-22 16:26:09 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -2836,6 +2836,19 @@ See the option above and the .Xr xterm 1 man page. +.It Em Cs, Csr +Change the cursor style. +If set allows a sequence such as: +.Bd -literal -offset indent +$ printf '\e033[4 q' +.Ed +.Pp +To change the cursor to an underline. +If +.Em Csr +is set, it will be used to reset the cursor style instead +of +.Em Cs . .It Em Cc, Cr The first takes one string argument and is used to set the cursor colour; the second takes no arguments and restores the default cursor colour. diff --git a/tmux.h b/tmux.h index 249881d5..5317a5e0 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.626 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: tmux.h,v 1.627 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -185,7 +185,9 @@ enum tty_code_code { TTYC_CNORM, /* cursor_normal, ve */ TTYC_COLORS, /* max_colors, Co */ TTYC_CR, /* restore cursor colour, Cr */ + TTYC_CS1, /* set cursor style, Cs */ TTYC_CSR, /* change_scroll_region, cs */ + TTYC_CSR1, /* reset cursor style, Csr */ TTYC_CUB, /* parm_left_cursor, LE */ TTYC_CUB1, /* cursor_left, le */ TTYC_CUD, /* parm_down_cursor, DO */ @@ -712,6 +714,7 @@ struct screen { u_int cx; /* cursor x */ u_int cy; /* cursor y */ + u_int cstyle; /* cursor style */ char *ccolour; /* cursor colour string */ u_int rupper; /* scroll region top */ @@ -1010,6 +1013,7 @@ struct tty { u_int cx; u_int cy; + u_int cstyle; char *ccolour; int mode; @@ -1846,6 +1850,7 @@ void screen_init(struct screen *, u_int, u_int, u_int); void screen_reinit(struct screen *); void screen_free(struct screen *); void screen_reset_tabs(struct screen *); +void screen_set_cursor_style(struct screen *, u_int); void screen_set_cursor_colour(struct screen *, const char *); void screen_set_title(struct screen *, const char *); void screen_resize(struct screen *, u_int, u_int); diff --git a/tty-term.c b/tty-term.c index 0d594076..7ee3fac9 100644 --- a/tty-term.c +++ b/tty-term.c @@ -1,4 +1,4 @@ -/* $Id: tty-term.c,v 1.50 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: tty-term.c,v 1.51 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -47,7 +47,9 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = { { TTYC_CNORM, TTYCODE_STRING, "cnorm" }, { TTYC_COLORS, TTYCODE_NUMBER, "colors" }, { TTYC_CR, TTYCODE_STRING, "Cr" }, + { TTYC_CS1, TTYCODE_STRING, "Cs" }, { TTYC_CSR, TTYCODE_STRING, "csr" }, + { TTYC_CSR1, TTYCODE_STRING, "Csr" }, { TTYC_CUB, TTYCODE_STRING, "cub" }, { TTYC_CUB1, TTYCODE_STRING, "cub1" }, { TTYC_CUD, TTYCODE_STRING, "cud" }, diff --git a/tty.c b/tty.c index 7464c337..b4e4efcc 100644 --- a/tty.c +++ b/tty.c @@ -1,4 +1,4 @@ -/* $Id: tty.c,v 1.211 2011-05-22 16:25:02 tcunha Exp $ */ +/* $Id: tty.c,v 1.212 2011-05-22 16:26:09 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -69,6 +69,7 @@ tty_init(struct tty *tty, int fd, char *term) if ((path = ttyname(fd)) == NULL) fatalx("ttyname failed"); tty->path = xstrdup(path); + tty->cstyle = 0; tty->ccolour = xstrdup(""); tty->flags = 0; @@ -244,6 +245,12 @@ tty_stop_tty(struct tty *tty) tty_raw(tty, tty_term_string(tty->term, TTYC_SGR0)); tty_raw(tty, tty_term_string(tty->term, TTYC_RMKX)); tty_raw(tty, tty_term_string(tty->term, TTYC_CLEAR)); + if (tty_term_has(tty->term, TTYC_CS1) && tty->cstyle != 0) { + if (tty_term_has(tty->term, TTYC_CSR1)) + tty_raw(tty, tty_term_string(tty->term, TTYC_CSR1)); + else if (tty_term_has(tty->term, TTYC_CS1)) + tty_raw(tty, tty_term_string1(tty->term, TTYC_CS1, 0)); + } tty_raw(tty, tty_term_string(tty->term, TTYC_CR)); tty_raw(tty, tty_term_string(tty->term, TTYC_CNORM)); @@ -429,6 +436,16 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s) else tty_putcode(tty, TTYC_CIVIS); } + if (tty->cstyle != s->cstyle) { + if (tty_term_has(tty->term, TTYC_CS1)) { + if (s->cstyle == 0 && + tty_term_has(tty->term, TTYC_CSR1)) + tty_putcode(tty, TTYC_CSR1); + else + tty_putcode1(tty, TTYC_CS1, s->cstyle); + } + tty->cstyle = s->cstyle; + } if (changed & ALL_MOUSE_MODES) { if (mode & ALL_MOUSE_MODES) { if (mode & MODE_MOUSE_UTF8)