Add support for OSC color sequences
This commit is contained in:
parent
2f6e597ed8
commit
8e31030390
|
@ -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 */
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
80
st.c
80
st.c
|
@ -1842,6 +1842,42 @@ csireset(void)
|
|||
memset(&csiescseq, 0, sizeof(csiescseq));
|
||||
}
|
||||
|
||||
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%02x\007",
|
||||
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", index);
|
||||
return;
|
||||
}
|
||||
|
||||
n = snprintf(buf, sizeof buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
|
||||
num, r, r, g, g, b, b);
|
||||
|
||||
ttywrite(buf, n, 1);
|
||||
}
|
||||
|
||||
void
|
||||
strhandle(void)
|
||||
{
|
||||
|
@ -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 color: %s\n", p);
|
||||
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 color: %s\n", p);
|
||||
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: %s\n", p);
|
||||
else
|
||||
redraw();
|
||||
break;
|
||||
case 4: /* color set */
|
||||
if (narg < 3)
|
||||
break;
|
||||
|
@ -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 parameter */
|
||||
fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
|
||||
|
|
3
st.h
3
st.h
|
@ -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;
|
||||
|
@ -123,3 +125,4 @@ extern char *termname;
|
|||
extern unsigned int tabspaces;
|
||||
extern unsigned int defaultfg;
|
||||
extern unsigned int defaultbg;
|
||||
extern unsigned int defaultcs;
|
||||
|
|
13
x.c
13
x.c
|
@ -799,6 +799,19 @@ xloadcols(void)
|
|||
loaded = 1;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue