From 9f2d1ec07419dca4c66f639ab37ac5bcc7adba04 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 8 May 2011 19:53:09 +0000 Subject: Use the tsl and fsl terminfo(5) capabilities to update terminal title and automatically fill them in on terminals with the XT capability (which means their title setting is xterm-compatible). From hsim at gmx.li. --- usr.bin/tmux/options-table.c | 4 ++-- usr.bin/tmux/tmux.1 | 6 +++--- usr.bin/tmux/tmux.h | 9 ++++++--- usr.bin/tmux/tty-term.c | 21 ++++++++++++++++++--- usr.bin/tmux/tty.c | 11 +++++------ 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/usr.bin/tmux/options-table.c b/usr.bin/tmux/options-table.c index 509cca04b74..98af34420fd 100644 --- a/usr.bin/tmux/options-table.c +++ b/usr.bin/tmux/options-table.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options-table.c,v 1.5 2011/04/18 19:49:05 nicm Exp $ */ +/* $OpenBSD: options-table.c,v 1.6 2011/05/08 19:53:06 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -355,7 +355,7 @@ const struct options_table_entry session_options_table[] = { { .name = "terminal-overrides", .type = OPTIONS_TABLE_STRING, - .default_str = "*88col*:colors=88,*256col*:colors=256" + .default_str = "*88col*:colors=88,*256col*:colors=256,xterm*:XT" }, { .name = "update-environment", diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index b5388e49587..2f7763273ed 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.224 2011/04/24 21:32:07 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.225 2011/05/08 19:53:06 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: April 24 2011 $ +.Dd $Mdocdate: May 8 2011 $ .Dt TMUX 1 .Os .Sh NAME @@ -2145,7 +2145,7 @@ The default value forcibly corrects the .Ql colors entry for terminals which support 88 or 256 colours: .Bd -literal -offset indent -"*88col*:colors=88,*256col*:colors=256" +"*88col*:colors=88,*256col*:colors=256,xterm*:XT" .Ed .It Ic update-environment Ar variables Set a space-separated string containing a list of environment variables to be diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 007ff0659ef..4ee800443d9 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.282 2011/04/19 21:31:33 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.283 2011/05/08 19:53:07 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -205,6 +205,7 @@ enum tty_code_code { TTYC_EL, /* clr_eol, ce */ TTYC_EL1, /* clr_bol, cb */ TTYC_ENACS, /* ena_acs, eA */ + TTYC_FSL, /* from_status_line, fsl */ TTYC_HOME, /* cursor_home, ho */ TTYC_HPA, /* column_address, ch */ TTYC_ICH, /* parm_ich, IC */ @@ -317,17 +318,19 @@ enum tty_code_code { TTYC_SETAB, /* set_a_background, AB */ TTYC_SETAF, /* set_a_foreground, AF */ TTYC_SGR0, /* exit_attribute_mode, me */ + TTYC_SITM, /* enter_italics_mode, it */ TTYC_SMACS, /* enter_alt_charset_mode, as */ TTYC_SMCUP, /* enter_ca_mode, ti */ TTYC_SMIR, /* enter_insert_mode, im */ TTYC_SMKX, /* keypad_xmit, ks */ TTYC_SMSO, /* enter_standout_mode, so */ TTYC_SMUL, /* enter_underline_mode, us */ - TTYC_SITM, /* enter_italics_mode, it */ + TTYC_TSL, /* to_status_line, tsl */ TTYC_VPA, /* row_address, cv */ TTYC_XENL, /* eat_newline_glitch, xn */ + TTYC_XT, /* xterm(1)-compatible title, XT */ }; -#define NTTYCODE (TTYC_XENL + 1) +#define NTTYCODE (TTYC_XT + 1) /* Termcap types. */ enum tty_code_type { diff --git a/usr.bin/tmux/tty-term.c b/usr.bin/tmux/tty-term.c index 2073d2e4f09..93b912ad159 100644 --- a/usr.bin/tmux/tty-term.c +++ b/usr.bin/tmux/tty-term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-term.c,v 1.21 2011/04/09 07:48:08 nicm Exp $ */ +/* $OpenBSD: tty-term.c,v 1.22 2011/05/08 19:53:08 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -60,6 +60,7 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = { { TTYC_EL, TTYCODE_STRING, "el" }, { TTYC_EL1, TTYCODE_STRING, "el1" }, { TTYC_ENACS, TTYCODE_STRING, "enacs" }, + { TTYC_FSL, TTYCODE_STRING, "fsl" }, { TTYC_HOME, TTYCODE_STRING, "home" }, { TTYC_HPA, TTYCODE_STRING, "hpa" }, { TTYC_ICH, TTYCODE_STRING, "ich" }, @@ -172,15 +173,17 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = { { TTYC_SETAB, TTYCODE_STRING, "setab" }, { TTYC_SETAF, TTYCODE_STRING, "setaf" }, { TTYC_SGR0, TTYCODE_STRING, "sgr0" }, + { TTYC_SITM, TTYCODE_STRING, "sitm" }, { TTYC_SMACS, TTYCODE_STRING, "smacs" }, { TTYC_SMCUP, TTYCODE_STRING, "smcup" }, { TTYC_SMIR, TTYCODE_STRING, "smir" }, { TTYC_SMKX, TTYCODE_STRING, "smkx" }, { TTYC_SMSO, TTYCODE_STRING, "smso" }, { TTYC_SMUL, TTYCODE_STRING, "smul" }, - { TTYC_SITM, TTYCODE_STRING, "sitm" }, + { TTYC_TSL, TTYCODE_STRING, "tsl" }, { TTYC_VPA, TTYCODE_STRING, "vpa" }, { TTYC_XENL, TTYCODE_FLAG, "xenl" }, + { TTYC_XT, TTYCODE_FLAG, "XT" }, }; char * @@ -252,7 +255,7 @@ tty_term_override(struct tty_term *term, const char *overrides) entstr[strlen(entstr) - 1] = '\0'; removeflag = 1; } else - continue; + val = xstrdup(""); for (i = 0; i < NTTYCODE; i++) { ent = &tty_term_codes[i]; @@ -423,6 +426,18 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause) for (; acs[0] != '\0' && acs[1] != '\0'; acs += 2) term->acs[(u_char) acs[0]][0] = acs[1]; + /* On terminals with xterm titles (XT), fill in tsl and fsl. */ + if (tty_term_flag(term, TTYC_XT) && + !tty_term_has(term, TTYC_TSL) && + !tty_term_has(term, TTYC_FSL)) { + code = &term->codes[TTYC_TSL]; + code->value.string = xstrdup("\033]0;"); + code->type = TTYCODE_STRING; + code = &term->codes[TTYC_FSL]; + code->value.string = xstrdup("\007"); + code->type = TTYCODE_STRING; + } + return (term); error: diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c index d26af944bd6..d1fe3acce08 100644 --- a/usr.bin/tmux/tty.c +++ b/usr.bin/tmux/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.104 2011/04/09 07:48:08 nicm Exp $ */ +/* $OpenBSD: tty.c,v 1.105 2011/05/08 19:53:08 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -369,14 +369,13 @@ tty_pututf8(struct tty *tty, const struct grid_utf8 *gu) void tty_set_title(struct tty *tty, const char *title) { - if (strstr(tty->termname, "xterm") == NULL && - strstr(tty->termname, "rxvt") == NULL && - strcmp(tty->termname, "screen") != 0) + if (!tty_term_has(tty->term, TTYC_TSL) || + !tty_term_has(tty->term, TTYC_FSL)) return; - tty_puts(tty, "\033]0;"); + tty_putcode(tty, TTYC_TSL); tty_puts(tty, title); - tty_putc(tty, '\007'); + tty_putcode(tty, TTYC_FSL); } void -- cgit v1.2.3