ref: b457388fd65edc971034a534c306e269ccf604d7
parent: a08889d01cb49c0b9169181d483d2e2b7d03b195
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Mon Apr 13 08:06:13 EDT 2020
fix entering color value as hex manually
--- a/picker.c
+++ b/picker.c
@@ -324,32 +324,29 @@
}
static int
-str2color(char *s, Color *c)
+hex2color(char *h, Color *c)
{
vlong v;
- char *a[3], *e;
int i, n;
+ char *e;
- if ((n = tokenize(s, a, nelem(a))) < 2) {
- werrstr("columns: %d", n);
- return -1;
- }
- n = strlen(a[1]);
+ n = strlen(h);
if (n != 6 && n != 8) {
werrstr("components: %d", n);
return -1;
}
c->nchan = n == 6 ? 3 : 4;
- if ((v = strtoll(a[1], &e, 16)) == 0 && (e == a[1] || *e || v < 0 || (n == 6 && v > 0xffffff) || (n == 8 && v > 0xffffffff))) {
- werrstr("color: '%s'", a[1]);
+ if ((v = strtoll(h, &e, 16)) == 0 &&
+ (e == h || *e || v < 0 || (n == 6 && v > 0xffffff) || (n == 8 && v > 0xffffffff))) {
+ werrstr("color: '%s'", h);
return -1;
}
- c->id = strdup(a[0]);
if (c->nchan < 4) {
v <<= 8;
v |= 0xff;
}
c->u = v;
+
for (i = 0; i < 4; i++) {
c->rgba[i] = (double)((v>>24)&0xff) / 255.0;
v <<= 8;
@@ -360,6 +357,23 @@
return 0;
}
+static int
+line2color(char *s, Color *c)
+{
+ char *a[3];
+ int n;
+
+ if ((n = tokenize(s, a, nelem(a))) < 2) {
+ werrstr("columns: %d", n);
+ return -1;
+ }
+ if (hex2color(a[1], c) != 0)
+ return -1;
+ c->id = strdup(a[0]);
+
+ return 0;
+}
+
static void
readcolors(Biobuf *b)
{
@@ -372,7 +386,7 @@
if (new == nil)
new = calloc(1, sizeof(Color));
- n = str2color(s, new);
+ n = line2color(s, new);
free(s);
if (n != 0) {
@@ -598,9 +612,9 @@
}
} else if (m.buttons == 2) {
strcpy(buf, hex);
- if (enter(c->nchan < 4 ? "rgb:" : "rgba:", buf, sizeof(buf), mctl, kctl, nil) > 0) {
+ if (enter("rgb(a):", buf, sizeof(buf), mctl, kctl, nil) > 0) {
u = c->u;
- if (str2color(buf, c) == 0 && c->u != u) {
+ if (hex2color(buf, c) == 0 && c->u != u) {
c->u = ~c->u; /* just for the update to kick in */
goto changed;
}