shithub: zuke

ref: 0454f07cb301bb998a5e4569454becb5de910791
dir: /theme.h/

View raw version
enum {
	Dback = 0,
	Dfhigh,
	Dfmed,
	Dflow,
	Dfinv,
	Dbhigh,
	Dbmed,
	Dblow,
	Dbinv,
	Numcolors,
};

typedef struct ThemeColor ThemeColor;

struct ThemeColor {
	char *id;
	u32int rgb;
	Image *im;
};

static ThemeColor colors[Numcolors] = {
	[Dback]  = {"background", 0x000000},
	[Dfhigh] = {"f_high",     0xffffff},
	[Dfmed]  = {"f_med",      0x777777},
	[Dflow]  = {"f_low",      0x444444},
	[Dfinv]  = {"f_inv",      0x000000},
	[Dbhigh] = {"b_high",     0xdddddd},
	[Dbmed]  = {"b_med",      0x72dec2},
	[Dblow]  = {"b_low",      0x222222},
	[Dbinv]  = {"b_inv",      0xffb545},
};

static void
runpicker(void *x)
{
	int *p, f;
	char tmp[64];

	snprint(tmp, sizeof(tmp), "new -pid %d -dx %d -dy %d", getpid(), 384, 320);
	newwindow(tmp);

	p = x;
	dup(p[0], 0); close(p[0]); close(p[1]);
	dup(p[3], 1); close(p[3]); close(p[2]);
	f = open("/dev/null", OWRITE); dup(f, 2); close(f);
	procexecl(nil, "/bin/picker", "picker", nil);

	threadexits("exec: %r");
}

static void
themeproc(void *x)
{
	Biobuf *in, *out;
	char *s, *v[3];
	int p[4], n, i;
	void (*redraw)(void);

	redraw = x;
	threadsetname("themeproc");
	pipe(p);
	pipe(p+2);
	procrfork(runpicker, p, 4096, RFFDG|RFNAMEG);
	close(p[0]);
	close(p[3]);
	out = Bfdopen(p[1], OWRITE);
	in = Bfdopen(p[2], OREAD);

	for(i = 0; i < nelem(colors); i++)
		Bprint(out, "%s\t%06ux\n", colors[i].id, colors[i].rgb);
	Bterm(out);

	for(;;){
		if((s = Brdstr(in, '\n', 1)) == nil)
			break;
		if((n = tokenize(s, v, nelem(v))) == 2){
			for(i = 0; i < nelem(colors); i++){
				if(strcmp(colors[i].id, v[0]) == 0){
					lockdisplay(display);
					freeimage(colors[i].im);
					colors[i].rgb = strtoul(v[1], nil, 16);
					colors[i].im = allocimage(display, Rect(0,0,1,1), RGB24, 1, colors[i].rgb<<8 | 0xff);
					unlockdisplay(display);
					redraw();
					break;
				}
			}
		}
		free(s);
		if(n != 2)
			break;
	}
	Bterm(in);

	threadexits(nil);
}

static void
themeinit(void)
{
	int i;

	for(i = 0; i < Numcolors; i++)
		colors[i].im = allocimage(display, Rect(0,0,1,1), RGB24, 1, colors[i].rgb<<8 | 0xff);
}