Merge branch 'obsd-master' into master

This commit is contained in:
Thomas Adam 2021-10-26 00:01:13 +01:00
commit 6f46f71d58
4 changed files with 41 additions and 4 deletions

View File

@ -105,6 +105,21 @@ colour_split_rgb(int c, u_char *r, u_char *g, u_char *b)
*b = c & 0xff; *b = c & 0xff;
} }
/* Force colour to RGB if not already. */
int
colour_force_rgb(int c)
{
if (c & COLOUR_FLAG_RGB)
return (c);
if (c & COLOUR_FLAG_256)
return (colour_256toRGB(c));
if (c >= 0 && c <= 7)
return (colour_256toRGB(c));
if (c >= 90 & c <= 97)
return (colour_256toRGB(8 + c - 90));
return (-1);
}
/* Convert colour to a string. */ /* Convert colour to a string. */
const char * const char *
colour_tostring(int c) colour_tostring(int c)

View File

@ -101,6 +101,7 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
#define FORMAT_WINDOW_NAME 0x4000 #define FORMAT_WINDOW_NAME 0x4000
#define FORMAT_SESSION_NAME 0x8000 #define FORMAT_SESSION_NAME 0x8000
#define FORMAT_CHARACTER 0x10000 #define FORMAT_CHARACTER 0x10000
#define FORMAT_COLOUR 0x20000
/* Limit on recursion. */ /* Limit on recursion. */
#define FORMAT_LOOP_LIMIT 100 #define FORMAT_LOOP_LIMIT 100
@ -3555,7 +3556,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
/* /*
* Modifiers are a ; separated list of the forms: * Modifiers are a ; separated list of the forms:
* l,m,C,a,b,d,n,t,w,q,E,T,S,W,P,<,> * l,m,C,a,b,c,d,n,t,w,q,E,T,S,W,P,<,>
* =a * =a
* =/a * =/a
* =/a/ * =/a/
@ -3572,7 +3573,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
cp++; cp++;
/* Check single character modifiers with no arguments. */ /* Check single character modifiers with no arguments. */
if (strchr("labdnwETSWP<>", cp[0]) != NULL && if (strchr("labcdnwETSWP<>", cp[0]) != NULL &&
format_is_end(cp[1])) { format_is_end(cp[1])) {
format_add_modifier(&list, count, cp, 1, NULL, 0); format_add_modifier(&list, count, cp, 1, NULL, 0);
cp++; cp++;
@ -4052,10 +4053,10 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
const char *errstr, *copy, *cp, *marker = NULL; const char *errstr, *copy, *cp, *marker = NULL;
const char *time_format = NULL; const char *time_format = NULL;
char *copy0, *condition, *found, *new; char *copy0, *condition, *found, *new;
char *value, *left, *right, c; char *value, *left, *right;
size_t valuelen; size_t valuelen;
int modifiers = 0, limit = 0, width = 0; int modifiers = 0, limit = 0, width = 0;
int j; int j, c;
struct format_modifier *list, *cmp = NULL, *search = NULL; struct format_modifier *list, *cmp = NULL, *search = NULL;
struct format_modifier **sub = NULL, *mexp = NULL, *fm; struct format_modifier **sub = NULL, *mexp = NULL, *fm;
u_int i, count, nsub = 0; u_int i, count, nsub = 0;
@ -4126,6 +4127,9 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
case 'b': case 'b':
modifiers |= FORMAT_BASENAME; modifiers |= FORMAT_BASENAME;
break; break;
case 'c':
modifiers |= FORMAT_COLOUR;
break;
case 'd': case 'd':
modifiers |= FORMAT_DIRNAME; modifiers |= FORMAT_DIRNAME;
break; break;
@ -4201,6 +4205,18 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
goto done; goto done;
} }
/* Is this a colour? */
if (modifiers & FORMAT_COLOUR) {
new = format_expand1(es, copy);
c = colour_fromstring(new);
if (c == -1 || (c = colour_force_rgb(c)) == -1)
value = xstrdup("");
else
xasprintf(&value, "%06x", c & 0xffffff);
free(new);
goto done;
}
/* Is this a loop, comparison or condition? */ /* Is this a loop, comparison or condition? */
if (modifiers & FORMAT_SESSIONS) { if (modifiers & FORMAT_SESSIONS) {
value = format_loop_sessions(es, copy); value = format_loop_sessions(es, copy);

5
tmux.1
View File

@ -4214,6 +4214,7 @@ see the
.Sx STYLES .Sx STYLES
section. section.
Attributes are ignored. Attributes are ignored.
.Pp
.It Ic pane-base-index Ar index .It Ic pane-base-index Ar index
Like Like
.Ic base-index , .Ic base-index ,
@ -4830,6 +4831,10 @@ replaces a numeric argument by its ASCII equivalent, so
.Ql #{a:98} .Ql #{a:98}
results in results in
.Ql b . .Ql b .
.Ql c
replaces a
.Nm
colour by its six-digit hexadecimal RGB value.
.Pp .Pp
A limit may be placed on the length of the resultant string by prefixing it A limit may be placed on the length of the resultant string by prefixing it
by an by an

1
tmux.h
View File

@ -2617,6 +2617,7 @@ int input_key_get_mouse(struct screen *, struct mouse_event *, u_int,
int colour_find_rgb(u_char, u_char, u_char); int colour_find_rgb(u_char, u_char, u_char);
int colour_join_rgb(u_char, u_char, u_char); int colour_join_rgb(u_char, u_char, u_char);
void colour_split_rgb(int, u_char *, u_char *, u_char *); void colour_split_rgb(int, u_char *, u_char *, u_char *);
int colour_force_rgb(int);
const char *colour_tostring(int); const char *colour_tostring(int);
int colour_fromstring(const char *s); int colour_fromstring(const char *s);
int colour_256toRGB(int); int colour_256toRGB(int);