ref: bc762e9c9294990c0d2480295637c792363dcc8c
dir: /patches/winwatch.patch/
8a9,34
> static char *
> readall(int f, int *osz)
> {
> int bufsz, sz, n;
> char *s;
>
> bufsz = 1023;
> s = nil;
> for(sz = 0;; sz += n){
> if(bufsz-sz < 1024){
> bufsz *= 2;
> s = realloc(s, bufsz);
> }
> if((n = readn(f, s+sz, bufsz-sz-1)) < 1)
> break;
> }
> if(n < 0 || sz < 1){
> free(s);
> return nil;
> }
> s[sz] = 0;
> *osz = sz;
>
> return s;
> }
>
9a36,106
> Colrioback,
>
> /* the following group has to be in order, they are used by libframe */
> Colback,
> Colhigh,
> Colbord,
> Coltext,
> Colhtext,
>
> Coltitle,
> Colltitle,
> Colhold,
> Collhold,
> Colpalehold,
> Colpaletext,
> Colsize,
>
> /* menuhit */
> Colmenubar,
> Colmenuback,
> Colmenuhigh,
> Colmenubord,
> Colmenutext,
> Colmenuhtext,
>
> Numcolors
> };
>
> typedef struct Color Color;
>
> struct Color {
> char *id;
> union {
> u32int rgb;
> char *path;
> };
> int flags;
> };
>
> static Color theme[Numcolors] = {
> [Colrioback] = {"rioback", {0x777777}, 0},
> [Colback] = {"back", {0xffffff}, 0},
> [Colhigh] = {"high", {0xcccccc}, 0},
> [Colbord] = {"border", {0x999999}, 0},
> [Coltext] = {"text", {DBlack>>8}, 0},
> [Colhtext] = {"htext", {DBlack>>8}, 0},
> [Coltitle] = {"title", {DGreygreen>>8}, 0},
> [Colltitle] = {"ltitle", {DPalegreygreen>>8}, 0},
> [Colhold] = {"hold", {DMedblue>>8}, 0},
> [Collhold] = {"lhold", {DGreyblue>>8}, 0},
> [Colpalehold] = {"palehold", {DPalegreyblue>>8}, 0},
> [Colpaletext] = {"paletext", {0x666666}, 0},
> [Colsize] = {"size", {DRed>>8}, 0},
> [Colmenubar] = {"menubar", {DDarkgreen>>8}, 1},
> [Colmenuback] = {"menuback", {0xeaffea}, 1},
> [Colmenuhigh] = {"menuhigh", {DDarkgreen>>8}, 1},
> [Colmenubord] = {"menubord", {DMedgreen>>8}, 1},
> [Colmenutext] = {"menutext", {DBlack>>8}, 1},
> [Colmenuhtext] = {"menuhtext", {0xeaffea}, 1},
> };
>
> u32int
> color2rgb(Color c, int scale)
> {
> return ((((c.rgb >> 16) & 0xff) / scale) << 24) |
> ((((c.rgb >> 8) & 0xff) / scale) << 16) |
> (((c.rgb & 0xff) / scale) << 8) |
> 0xff;
> }
>
> enum {
30c127
< Image *statecol[4];
---
> Image *statecol[5];
178c275
< _string(screen, addpt(win[i].r.min, Pt(2,0)), display->black, ZP,
---
> _string(screen, addpt(win[i].r.min, Pt(2,0)), statecol[4], ZP,
181c278
< border(screen, win[i].r, 1, display->black, ZP);
---
> border(screen, win[i].r, 1, statecol[4], ZP);
316a414,461
> themeload(char *s, int n)
> {
> int i;
> char *t, *a[2], *e;
> Image *newc;
> u32int rgb;
>
> if((t = malloc(n+1)) == nil)
> return;
> memmove(t, s, n);
> t[n] = 0;
>
> for(s = t; s != nil && *s; s = e){
> if((e = strchr(s, '\n')) != nil)
> *e++ = 0;
> if(tokenize(s, a, 2) == 2){
> for(i = 0; i < nelem(theme); i++) {
> if(strcmp(theme[i].id, a[0]) == 0) {
> rgb = strtoul(a[1], nil, 16);
> if((newc = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, rgb<<8 | 0xff)) != nil) {
> theme[i].rgb = rgb;
> }
> break;
> }
> }
> }
> }
> free(t);
> }
>
> char *
> themestring(int *n)
> {
> char *s, *t, *e;
> int i;
>
> if((t = malloc(512)) != nil){
> s = t;
> e = s+512;
> for(i = 0; i < nelem(theme); i++)
> s = seprint(s, e, "%s\t%06ux\n", theme[i].id, theme[i].rgb);
> *n = s - t;
> }
>
> return t;
> }
>
> void
342d486
< lightblue = allocimagemix(display, DPalebluegreen, DWhite);
344c488,501
< statecol[0] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xCCCCCCFF);
---
> // load theme
> int sz, f;
> char *s;
>
> if((f = open("/dev/theme", OREAD|OCEXEC)) >= 0){
> if((s = readall(f, &sz)) != nil)
> themeload(s, sz);
> free(s);
> close(f);
> }
>
> lightblue = allocimagemix(display, color2rgb(theme[Colback], 1), color2rgb(theme[Colback], 1));
>
> statecol[0] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, color2rgb(theme[Colhold], 2));
347c504,505
< statecol[3] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen);
---
> statecol[3] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, color2rgb(theme[Colltitle], 1));
> statecol[4] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, color2rgb(theme[Colmenubord], 1));