ref: 7062be1f88c9d33a72b8f337134e2bd4d68931ff
dir: /theme.h/
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);
}