summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2011-05-08 19:53:06 +0000
committerNicholas Marriott <nicm@openbsd.org>2011-05-08 19:53:06 +0000
commit295ace682020769be8a6a6a02835099d93c392ef (patch)
treed55f3d1563aa55d9a5d9aa95eb4bdc29fed2afee
parentb0a88ebeadd56ebcb0cdbe9967a869d361b96c6f (diff)
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.
-rw-r--r--options-table.c2
-rw-r--r--tmux.12
-rw-r--r--tmux.h7
-rw-r--r--tty-term.c19
-rw-r--r--tty.c9
5 files changed, 28 insertions, 11 deletions
diff --git a/options-table.c b/options-table.c
index 454dbffa..8da5d3a2 100644
--- a/options-table.c
+++ b/options-table.c
@@ -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/tmux.1 b/tmux.1
index 45db380a..b7fb5180 100644
--- a/tmux.1
+++ b/tmux.1
@@ -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/tmux.h b/tmux.h
index def69db5..42460640 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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/tty-term.c b/tty-term.c
index 59a1bbba..f1e6d878 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -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/tty.c b/tty.c
index 73dff0be..b423f6d8 100644
--- a/tty.c
+++ b/tty.c
@@ -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