ref: 4e3601d7e3618bbb1832af2f9e8d8245c5ea0570
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); }