aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--format.c2
-rw-r--r--server-client.c2
-rw-r--r--tmux.13
-rw-r--r--tmux.h2
-rw-r--r--tty-features.c38
-rw-r--r--tty-keys.c55
6 files changed, 60 insertions, 42 deletions
diff --git a/format.c b/format.c
index 88378a27..97fcb81f 100644
--- a/format.c
+++ b/format.c
@@ -2617,6 +2617,8 @@ format_defaults_client(struct format_tree *ft, struct client *c)
format_add(ft, "client_termname", "%s", c->term_name);
format_add(ft, "client_termfeatures", "%s",
tty_get_features(c->term_features));
+ if (c->term_type != NULL)
+ format_add(ft, "client_termtype", "%s", c->term_type);
format_add_tv(ft, "client_created", &c->creation_time);
format_add_tv(ft, "client_activity", &c->activity_time);
diff --git a/server-client.c b/server-client.c
index 1bdb103a..26958c5d 100644
--- a/server-client.c
+++ b/server-client.c
@@ -294,7 +294,9 @@ server_client_lost(struct client *c)
if (c->flags & CLIENT_TERMINAL)
tty_free(&c->tty);
free(c->ttyname);
+
free(c->term_name);
+ free(c->term_type);
status_free(c);
diff --git a/tmux.1 b/tmux.1
index 2dd6cbab..dcb6f4c4 100644
--- a/tmux.1
+++ b/tmux.1
@@ -4463,7 +4463,8 @@ The following variables are available, where appropriate:
.It Li "client_readonly" Ta "" Ta "1 if client is readonly"
.It Li "client_session" Ta "" Ta "Name of the client's session"
.It Li "client_termname" Ta "" Ta "Terminal name of client"
-.It Li "client_termfeatures" Ta "" Ta "Terminal features of client"
+.It Li "client_termtype" Ta "" Ta "Terminal type of client, if available"
+.It Li "client_termfeatures" Ta "" Ta "Terminal features of client, if any"
.It Li "client_tty" Ta "" Ta "Pseudo terminal of client"
.It Li "client_utf8" Ta "" Ta "1 if client supports UTF-8"
.It Li "client_width" Ta "" Ta "Width of client"
diff --git a/tmux.h b/tmux.h
index 6cbc0d81..85276aea 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1506,6 +1506,7 @@ struct client {
char *term_name;
int term_features;
+ char *term_type;
char *ttyname;
struct tty tty;
@@ -2030,6 +2031,7 @@ const char *tty_term_describe(struct tty_term *, enum tty_code_code);
void tty_add_features(int *, const char *, const char *);
const char *tty_get_features(int);
int tty_apply_features(struct tty_term *, int);
+void tty_default_features(int *, const char *, u_int);
/* tty-acs.c */
int tty_acs_needed(struct tty *);
diff --git a/tty-features.c b/tty-features.c
index 7505c96b..d19160ff 100644
--- a/tty-features.c
+++ b/tty-features.c
@@ -201,7 +201,7 @@ tty_add_features(int *feat, const char *s, const char *separators)
char *next, *loop, *copy;
u_int i;
- log_debug("%s: %s", __func__, s);
+ log_debug("adding terminal features %s", s);
loop = copy = xstrdup(s);
while ((next = strsep(&loop, separators)) != NULL) {
@@ -275,3 +275,39 @@ tty_apply_features(struct tty_term *term, int feat)
term->features |= feat;
return (1);
}
+
+void
+tty_default_features(int *feat, const char *name, u_int version)
+{
+ static struct {
+ const char *name;
+ u_int version;
+ const char *features;
+ } table[] = {
+ { .name = "mintty",
+ .features = "256,RGB,ccolour,clipboard,cstyle,margins,overline,title"
+ },
+ { .name = "tmux",
+ .features = "256,RGB,ccolour,clipboard,cstyle,overline,title,usstyle"
+ },
+ { .name = "rxvt-unicode",
+ .features = "256,title"
+ },
+ { .name = "iTerm2",
+ .features = "256,RGB,clipboard,cstyle,margins,sync,title"
+ },
+ { .name = "XTerm",
+ .features = "256,RGB,ccolour,clipboard,cstyle,margins,rectfill,title"
+ }
+ };
+ u_int i;
+
+ for (i = 0; i < nitems(table); i++) {
+ if (strcmp(table[i].name, name) != 0)
+ continue;
+ if (version != 0 && version < table[i].version)
+ continue;
+ tty_add_features(feat, table[i].features, ",");
+ }
+
+}
diff --git a/tty-keys.c b/tty-keys.c
index 8c778b2a..f5a3418f 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -1070,28 +1070,13 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
",");
break;
case 'M': /* mintty */
- tty_add_features(&c->term_features,
- "256,"
- "RGB,"
- "title",
- ",");
+ tty_default_features(&c->term_features, "mintty", 0);
break;
case 'T': /* tmux */
- tty_add_features(&c->term_features,
- "256,"
- "RGB,"
- "ccolour,"
- "cstyle,"
- "overline,"
- "title,"
- "usstyle",
- ",");
+ tty_default_features(&c->term_features, "tmux", 0);
break;
case 'U': /* rxvt-unicode */
- tty_add_features(&c->term_features,
- "256,"
- "title",
- ",");
+ tty_default_features(&c->term_features, "rxvt-unicode", 0);
break;
}
log_debug("%s: received secondary DA %.*s", c->name, (int)*size, buf);
@@ -1112,7 +1097,7 @@ tty_keys_extended_device_attributes(struct tty *tty, const char *buf,
{
struct client *c = tty->client;
u_int i;
- char tmp[64];
+ char tmp[128];
*size = 0;
if (tty->flags & TTY_HAVEXDA)
@@ -1150,29 +1135,19 @@ tty_keys_extended_device_attributes(struct tty *tty, const char *buf,
*size = 5 + i;
/* Add terminal features. */
- if (strncmp(tmp, "iTerm2 ", 7) == 0) {
- tty_add_features(&c->term_features,
- "256,"
- "RGB,"
- "clipboard,"
- "cstyle,"
- "margins,"
- "sync,"
- "title",
- ",");
- } else if (strncmp(tmp, "tmux ", 5) == 0) {
- tty_add_features(&c->term_features,
- "256,"
- "RGB,"
- "ccolour,"
- "cstyle,"
- "overline,"
- "title,"
- "usstyle",
- ",");
- }
+ if (strncmp(tmp, "iTerm2 ", 7) == 0)
+ tty_default_features(&c->term_features, "iTerm2", 0);
+ else if (strncmp(tmp, "tmux ", 5) == 0)
+ tty_default_features(&c->term_features, "tmux", 0);
+ else if (strncmp(tmp, "XTerm(", 6) == 0)
+ tty_default_features(&c->term_features, "xterm", 0);
+ else if (strncmp(tmp, "mintty ", 7) == 0)
+ tty_default_features(&c->term_features, "mintty", 0);
log_debug("%s: received extended DA %.*s", c->name, (int)*size, buf);
+ free(c->term_type);
+ c->term_type = xstrdup(tmp);
+
tty_update_features(tty);
tty->flags |= TTY_HAVEXDA;