tAdd support for OSC color sequences - st - [fork] customized build of st, the … | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 8e310303903792c010d03c046ba75f8b18f7d3a7 | |
parent 2f6e597ed871cff91c627850d03152cae5f45779 | |
Author: Raheman Vaiya <[email protected]> | |
Date: Sun, 26 Dec 2021 18:57:04 +0100 | |
Add support for OSC color sequences | |
Diffstat: | |
M config.def.h | 8 +++++--- | |
M st.c | 80 +++++++++++++++++++++++++++++… | |
M st.h | 3 +++ | |
M x.c | 13 +++++++++++++ | |
4 files changed, 100 insertions(+), 4 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -120,6 +120,8 @@ static const char *colorname[] = { | |
/* more colors can be added after 255 to use with DefaultXX */ | |
"#cccccc", | |
"#555555", | |
+ "gray90", /* default foreground colour */ | |
+ "black", /* default background colour */ | |
}; | |
t@@ -127,9 +129,9 @@ static const char *colorname[] = { | |
* Default colors (colorname index) | |
* foreground, background, cursor, reverse cursor | |
*/ | |
-unsigned int defaultfg = 7; | |
-unsigned int defaultbg = 0; | |
-static unsigned int defaultcs = 256; | |
+unsigned int defaultfg = 258; | |
+unsigned int defaultbg = 259; | |
+unsigned int defaultcs = 256; | |
static unsigned int defaultrcs = 257; | |
/* | |
diff --git a/st.c b/st.c | |
t@@ -1843,6 +1843,42 @@ csireset(void) | |
} | |
void | |
+osc4_color_response(int num) | |
+{ | |
+ int n; | |
+ char buf[32]; | |
+ unsigned char r, g, b; | |
+ | |
+ if (xgetcolor(num, &r, &g, &b)) { | |
+ fprintf(stderr, "erresc: failed to fetch osc4 color %d\n", num… | |
+ return; | |
+ } | |
+ | |
+ n = snprintf(buf, sizeof buf, "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02… | |
+ num, r, r, g, g, b, b); | |
+ | |
+ ttywrite(buf, n, 1); | |
+} | |
+ | |
+void | |
+osc_color_response(int index, int num) | |
+{ | |
+ int n; | |
+ char buf[32]; | |
+ unsigned char r, g, b; | |
+ | |
+ if (xgetcolor(index, &r, &g, &b)) { | |
+ fprintf(stderr, "erresc: failed to fetch osc color %d\n", inde… | |
+ return; | |
+ } | |
+ | |
+ n = snprintf(buf, sizeof buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\… | |
+ num, r, r, g, g, b, b); | |
+ | |
+ ttywrite(buf, n, 1); | |
+} | |
+ | |
+void | |
strhandle(void) | |
{ | |
char *p = NULL, *dec; | |
t@@ -1880,6 +1916,45 @@ strhandle(void) | |
} | |
} | |
return; | |
+ case 10: | |
+ if (narg < 2) | |
+ break; | |
+ | |
+ p = strescseq.args[1]; | |
+ | |
+ if (!strcmp(p, "?")) | |
+ osc_color_response(defaultfg, 10); | |
+ else if (xsetcolorname(defaultfg, p)) | |
+ fprintf(stderr, "erresc: invalid foreground co… | |
+ else | |
+ redraw(); | |
+ break; | |
+ case 11: | |
+ if (narg < 2) | |
+ break; | |
+ | |
+ p = strescseq.args[1]; | |
+ | |
+ if (!strcmp(p, "?")) | |
+ osc_color_response(defaultbg, 11); | |
+ else if (xsetcolorname(defaultbg, p)) | |
+ fprintf(stderr, "erresc: invalid background co… | |
+ else | |
+ redraw(); | |
+ break; | |
+ case 12: | |
+ if (narg < 2) | |
+ break; | |
+ | |
+ p = strescseq.args[1]; | |
+ | |
+ if (!strcmp(p, "?")) | |
+ osc_color_response(defaultcs, 12); | |
+ else if (xsetcolorname(defaultcs, p)) | |
+ fprintf(stderr, "erresc: invalid cursor color:… | |
+ else | |
+ redraw(); | |
+ break; | |
case 4: /* color set */ | |
if (narg < 3) | |
break; | |
t@@ -1887,7 +1962,10 @@ strhandle(void) | |
/* FALLTHROUGH */ | |
case 104: /* color reset, here p = NULL */ | |
j = (narg > 1) ? atoi(strescseq.args[1]) : -1; | |
- if (xsetcolorname(j, p)) { | |
+ | |
+ if (!strcmp(p, "?")) | |
+ osc4_color_response(j); | |
+ else if (xsetcolorname(j, p)) { | |
if (par == 104 && narg <= 1) | |
return; /* color reset without paramet… | |
fprintf(stderr, "erresc: invalid color j=%d, p… | |
diff --git a/st.h b/st.h | |
t@@ -111,6 +111,8 @@ void *xmalloc(size_t); | |
void *xrealloc(void *, size_t); | |
char *xstrdup(const char *); | |
+int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b); | |
+ | |
/* config.h globals */ | |
extern char *utmp; | |
extern char *scroll; | |
t@@ -123,3 +125,4 @@ extern char *termname; | |
extern unsigned int tabspaces; | |
extern unsigned int defaultfg; | |
extern unsigned int defaultbg; | |
+extern unsigned int defaultcs; | |
diff --git a/x.c b/x.c | |
t@@ -800,6 +800,19 @@ xloadcols(void) | |
} | |
int | |
+xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) | |
+{ | |
+ if (!BETWEEN(x, 0, dc.collen)) | |
+ return 1; | |
+ | |
+ *r = dc.col[x].color.red >> 8; | |
+ *g = dc.col[x].color.green >> 8; | |
+ *b = dc.col[x].color.blue >> 8; | |
+ | |
+ return 0; | |
+} | |
+ | |
+int | |
xsetcolorname(int x, const char *name) | |
{ | |
Color ncolor; |