summaryrefslogtreecommitdiffstats
path: root/format.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2021-10-26 00:01:13 +0100
committerThomas Adam <thomas@xteddy.org>2021-10-26 00:01:13 +0100
commit6f46f71d58d508703c29ddc50c04bb4b56603e20 (patch)
tree9ea7bdd539a666bca2cee4908d53362fcd264bc5 /format.c
parent3934d9b24de376cf0b6868c56751b55bd2d60399 (diff)
parent197a116f5a2146309c4c6fecbd9d08d36f2be750 (diff)
Merge branch 'obsd-master' into master
Diffstat (limited to 'format.c')
-rw-r--r--format.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/format.c b/format.c
index d8d60b3c..2fc0961e 100644
--- a/format.c
+++ b/format.c
@@ -101,6 +101,7 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
#define FORMAT_WINDOW_NAME 0x4000
#define FORMAT_SESSION_NAME 0x8000
#define FORMAT_CHARACTER 0x10000
+#define FORMAT_COLOUR 0x20000
/* Limit on recursion. */
#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:
- * 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/
@@ -3572,7 +3573,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
cp++;
/* 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_add_modifier(&list, count, cp, 1, NULL, 0);
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 *time_format = NULL;
char *copy0, *condition, *found, *new;
- char *value, *left, *right, c;
+ char *value, *left, *right;
size_t valuelen;
int modifiers = 0, limit = 0, width = 0;
- int j;
+ int j, c;
struct format_modifier *list, *cmp = NULL, *search = NULL;
struct format_modifier **sub = NULL, *mexp = NULL, *fm;
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':
modifiers |= FORMAT_BASENAME;
break;
+ case 'c':
+ modifiers |= FORMAT_COLOUR;
+ break;
case 'd':
modifiers |= FORMAT_DIRNAME;
break;
@@ -4201,6 +4205,18 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
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? */
if (modifiers & FORMAT_SESSIONS) {
value = format_loop_sessions(es, copy);