1
0
mirror of https://github.com/tmux/tmux.git synced 2025-04-23 12:58:50 +00:00

Convert terminal-overrides to an array option.

This commit is contained in:
nicm 2017-01-24 20:05:15 +00:00
parent 16e43d6a42
commit b77dd75b57
3 changed files with 90 additions and 92 deletions

View File

@ -122,11 +122,12 @@ const struct options_table_entry options_table[] = {
},
{ .name = "terminal-overrides",
.type = OPTIONS_TABLE_STRING,
.type = OPTIONS_TABLE_ARRAY,
.scope = OPTIONS_TABLE_SERVER,
.default_str = "xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
":Cs=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
":Ss=\\E[%p1%d q:Se=\\E[2 q,screen*:XT"
":Ss=\\E[%p1%d q:Se=\\E[2 q,screen*:XT",
.separator = ","
},
{ .name = "assume-paste-time",

26
tmux.1
View File

@ -2495,12 +2495,12 @@ disallowedWindowOps: 20,21,SetXprop
Or changing this property from the
.Xr xterm 1
interactive menu when required.
.It Ic terminal-overrides Ar string
Contains a list of entries which override terminal descriptions read using
.Xr terminfo 5 .
.Ar string
is a comma-separated list of items each a colon-separated string made up of a
terminal type pattern (matched using
.It Ic terminal-overrides[] Ar string
Allow terminal descriptions read using
.Xr terminfo 5
to be overriden.
Each entry is a colon-separated string made up of a terminal type pattern
(matched using
.Xr fnmatch 3 )
and a set of
.Em name=value
@ -2511,16 +2511,10 @@ For example, to set the
.Xr terminfo 5
entry to
.Ql \ee[H\ee[2J
for all terminal types and the
.Ql dch1
entry to
.Ql \ee[P
for the
.Ql rxvt
terminal type, the option could be set to the string:
.Bd -literal -offset indent
"*:clear=\ee[H\ee[2J,rxvt:dch1=\ee[P"
.Ed
for all terminal types matching
.Ql rxvt* :
.Pp
.Dl "rxvt*:clear=\ee[H\ee[2J"
.Pp
The terminal entry value is passed through
.Xr strunvis 3

View File

@ -294,56 +294,54 @@ tty_term_strip(const char *s)
}
static void
tty_term_override(struct tty_term *term, const char *overrides)
tty_term_override(struct tty_term *term, const char *override)
{
const struct tty_term_code_entry *ent;
struct tty_code *code;
char *termnext, *termstr;
char *entnext, *entstr;
char *s, *ptr, *val;
char *next, *s, *copy, *cp, *value;
const char *errstr;
u_int i;
int n, removeflag;
int n, remove;
s = xstrdup(overrides);
copy = next = xstrdup(override);
termnext = s;
while ((termstr = strsep(&termnext, ",")) != NULL) {
entnext = termstr;
entstr = strsep(&entnext, ":");
if (entstr == NULL || entnext == NULL)
continue;
if (fnmatch(entstr, term->name, 0) != 0)
continue;
while ((entstr = strsep(&entnext, ":")) != NULL) {
if (*entstr == '\0')
continue;
val = NULL;
removeflag = 0;
if ((ptr = strchr(entstr, '=')) != NULL) {
*ptr++ = '\0';
val = xstrdup(ptr);
if (strunvis(val, ptr) == -1) {
free(val);
val = xstrdup(ptr);
s = strsep(&next, ":");
if (s == NULL || next == NULL || fnmatch(s, term->name, 0) != 0) {
free(copy);
return;
}
} else if (entstr[strlen(entstr) - 1] == '@') {
entstr[strlen(entstr) - 1] = '\0';
removeflag = 1;
} else
val = xstrdup("");
log_debug("%s override: %s %s",
term->name, entstr, removeflag ? "@" : val);
while ((s = strsep(&next, ":")) != NULL) {
if (*s == '\0')
continue;
value = NULL;
remove = 0;
if ((cp = strchr(s, '=')) != NULL) {
*cp++ = '\0';
value = xstrdup(cp);
if (strunvis(value, cp) == -1) {
free(value);
value = xstrdup(cp);
}
} else if (s[strlen(s) - 1] == '@') {
s[strlen(s) - 1] = '\0';
remove = 1;
} else
value = xstrdup("");
if (remove)
log_debug("%s override: %s@", term->name, s);
else
log_debug("%s override: %s=%s", term->name, s, value);
for (i = 0; i < tty_term_ncodes(); i++) {
ent = &tty_term_codes[i];
if (strcmp(entstr, ent->name) != 0)
if (strcmp(s, ent->name) != 0)
continue;
code = &term->codes[i];
if (removeflag) {
if (remove) {
code->type = TTYCODE_NONE;
continue;
}
@ -353,11 +351,11 @@ tty_term_override(struct tty_term *term, const char *overrides)
case TTYCODE_STRING:
if (code->type == TTYCODE_STRING)
free(code->value.string);
code->value.string = xstrdup(val);
code->value.string = xstrdup(value);
code->type = ent->type;
break;
case TTYCODE_NUMBER:
n = strtonum(val, 0, INT_MAX, &errstr);
n = strtonum(value, 0, INT_MAX, &errstr);
if (errstr != NULL)
break;
code->value.number = n;
@ -370,10 +368,8 @@ tty_term_override(struct tty_term *term, const char *overrides)
}
}
free(val);
free(value);
}
}
free(s);
}
@ -383,7 +379,8 @@ tty_term_find(char *name, int fd, char **cause)
struct tty_term *term;
const struct tty_term_code_entry *ent;
struct tty_code *code;
u_int i;
struct options_entry *o;
u_int size, i;
int n, error;
const char *s, *acs;
@ -457,8 +454,14 @@ tty_term_find(char *name, int fd, char **cause)
}
/* Apply terminal overrides. */
s = options_get_string(global_options, "terminal-overrides");
o = options_get_only(global_options, "terminal-overrides");
if (options_array_size(o, &size) != -1) {
for (i = 0; i < size; i++) {
s = options_array_get(o, i);
if (s != NULL)
tty_term_override(term, s);
}
}
/* Delete curses data. */
del_curterm(cur_term);