~petersanchez/st

b567f7b83d0e0672fbc987c60443a8ffa92c6962 — Raheman Vaiya 2 years ago 86ea785
Add support for OSC color sequences
5 files changed, 101 insertions(+), 6 deletions(-)

M config.def.h
M config.h
M st.c
M st.h
M x.c
M config.def.h => config.def.h +5 -4
@@ 123,7 123,8 @@ static const char *colorname[] = {
	/* more colors can be added after 255 to use with DefaultXX */
	"#cccccc",
	"#555555",
	"black",
	"gray90", /* default foreground colour */
	"black", /* default background colour */
};




@@ 131,9 132,9 @@ static const char *colorname[] = {
 * Default colors (colorname index)
 * foreground, background, cursor, reverse cursor
 */
unsigned int defaultfg = 7;
unsigned int defaultbg = 258;
static unsigned int defaultcs = 256;
unsigned int defaultfg = 258;
unsigned int defaultbg = 259;
unsigned int defaultcs = 256;
static unsigned int defaultrcs = 257;

/*

M config.h => config.h +1 -1
@@ 135,7 135,7 @@ static const char *colorname[] = {
 */
unsigned int defaultfg = 15;
unsigned int defaultbg = 256;
static unsigned int defaultcs = 15;
unsigned int defaultcs = 15;
static unsigned int defaultrcs = 15;

/*

M st.c => st.c +79 -1
@@ 1905,6 1905,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%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)
{
	char *p = NULL, *dec;


@@ 1942,6 1978,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;


@@ 1949,7 2024,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",

M st.h => st.h +3 -0
@@ 114,6 114,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;


@@ 126,4 128,5 @@ extern char *termname;
extern unsigned int tabspaces;
extern unsigned int defaultfg;
extern unsigned int defaultbg;
extern unsigned int defaultcs;
extern float alpha;

M x.c => x.c +13 -0
@@ 810,6 810,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;