Move terminal features into a single file.

This commit is contained in:
Nicholas Marriott 2020-04-24 06:40:30 +01:00
parent ca13208b6b
commit 8650f44340
6 changed files with 60 additions and 42 deletions

View File

@ -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);

View File

@ -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);

3
tmux.1
View File

@ -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"

2
tmux.h
View File

@ -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 *);

View File

@ -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, ",");
}
}

View File

@ -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;