ref: 1146757bfd9088ff4955a1d896ec7b5d4c894f2d
parent: 7062be1f88c9d33a72b8f337134e2bd4d68931ff
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Mon May 25 13:41:06 EDT 2020
revamp theming logic a bit
--- /dev/null
+++ b/theme.c
@@ -1,0 +1,163 @@
+#include <u.h>
+#include <libc.h>
+#include <plumb.h>
+#include <draw.h>
+#include <bio.h>
+#include <thread.h>
+#include "theme.h"
+
+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},+};
+
+void themechanged(void);
+
+static char *themeplumb;
+
+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 *)
+{+ Biobuf *in, *out;
+ char *s, *v[3];
+ int p[4], n, i;
+
+ 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){+ if(display->locking)
+ 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);
+ if(display->locking)
+ unlockdisplay(display);
+ themechanged();
+ break;
+ }
+ }
+ }
+ free(s);
+ if(n != 2)
+ break;
+ }
+ Bterm(in);
+
+ threadexits(nil);
+}
+
+static int
+loadtheme(char *filename, int init)
+{+ Biobuf *in;
+ char *s, *v[3];
+ int i, n;
+
+ if ((in = Bopen(filename, OREAD)) != nil) {+ if(display->locking && !init)
+ lockdisplay(display);
+ 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){+ 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);
+ break;
+ }
+ }
+ }
+ free(s);
+ if(n != 2)
+ break;
+ }
+ if(display->locking && !init)
+ unlockdisplay(display);
+ Bterm(in);
+ if(!init)
+ themechanged();
+ return 0;
+ }
+
+ return -1;
+}
+
+static void
+plumbproc(void *)
+{+ int f;
+ Plumbmsg *m;
+
+ threadsetname("theme/plumb");+ if ((f = plumbopen(themeplumb, OREAD)) >= 0) {+ while ((m = plumbrecv(f)) != nil) {+ loadtheme(m->data, 0);
+ themechanged();
+ plumbfree(m);
+ }
+ }
+
+ threadexits(nil);
+}
+
+void
+themeinit(void)
+{+ char *s;
+ int i;
+
+ if((s = getenv("theme")) != nil){+ if(loadtheme(s, 1) != 0)
+ sysfatal("theme load failed: %r");+ free(s);
+ }
+ for(i = 0; i < Numcolors; i++){+ if(colors[i].im == nil)
+ colors[i].im = allocimage(display, Rect(0,0,1,1), RGB24, 1, colors[i].rgb<<8 | 0xff);
+ }
+ if((themeplumb = getenv("themeplumb")) != nil)+ proccreate(plumbproc, nil, 4096);
+}
--- a/theme.h
+++ b/theme.h
@@ -19,88 +19,4 @@
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);
-}
+extern ThemeColor colors[Numcolors];
--- a/zuke.c
+++ b/zuke.c
@@ -1,13 +1,8 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
+#include "theme.c"
#include <mouse.h>
#include <keyboard.h>
-#include <thread.h>
#include <ctype.h>
-#include <bio.h>
#include "plist.h"
-#include "theme.h"
typedef struct Player Player;
@@ -242,6 +237,12 @@
flushimage(display, 1);
unlockdisplay(display);
+}
+
+void
+themechanged(void)
+{+ redraw();
}
static void
--
⑨