shithub: picker

Download patch

ref: 72a65f4596a41a569ef02852c9ab638d6329a481
parent: ffb97abccf0d8a01cf7db41c495103585d810699
author: Sigrid Haflínudóttir <[email protected]>
date: Mon Aug 10 05:58:05 EDT 2020

add "revert" and "revert all" to menu

--- a/picker.c
+++ b/picker.c
@@ -33,6 +33,7 @@
 	Image *i;
 	double v[4];
 	double rgba[4];
+	double rgba0[4]; /* that's for reverting back to the original */
 	Rectangle r;
 	u32int u;
 	int nchan;
@@ -115,7 +116,7 @@
 	},
 };
 
-static char *menu2i[nelem(spaces)+4];
+static char *menu2i[nelem(spaces)+6];
 static Menu menu2 = { .item = menu2i };
 
 static Color *colors, *color, *last;
@@ -409,6 +410,7 @@
 				free(c->id);
 				new->prev = c->prev;
 				new->next = c->next;
+				memmove(new->rgba0, c->rgba0, sizeof(new->rgba0));
 				memmove(c, new, sizeof(*c));
 				break;
 			}
@@ -416,6 +418,7 @@
 
 		if (c == nil) {
 			c = new;
+			memmove(c->rgba0, c->rgba, sizeof(c->rgba));
 			if (last != nil)
 				last->next = new;
 			new->prev = last;
@@ -487,7 +490,7 @@
 		[Cloaded] = { nil, nil, CHANRCV },
 		{ nil, nil, CHANEND },
 	};
-	int i, oldbuttons, slider;
+	int i, oldbuttons, slider, menusnarf, menusnarfall, menurevert, menurevertall, menuexit;
 	ulong u;
 	char buf[16];
 
@@ -523,9 +526,11 @@
 
 	for (i = 0; i < nelem(spaces); i++)
 		menu2i[i] = spaces[i].name;
-	menu2i[i++] = "snarf";
-	menu2i[i++] = "snarf all";
-	menu2i[i] = "exit";
+	menu2i[menusnarf = i++] = "snarf";
+	menu2i[menusnarfall = i++] = "snarf all";
+	menu2i[menurevert = i++] = "revert";
+	menu2i[menurevertall = i++] = "revert all";
+	menu2i[menuexit = i] = "exit";
 
 	if (initdraw(nil, nil, "picker") < 0)
 		sysfatal("initdraw: %r");
@@ -610,7 +615,7 @@
 					}
 				}
 			} else if (m.buttons == 4 && (i = menuhit(3, mctl, &menu2, nil)) >= 0) {
-				if (i == nelem(spaces)+2)
+				if (i == menuexit)
 					goto end;
 				if (i < nelem(spaces)) {
 					space = &spaces[i];
@@ -618,15 +623,34 @@
 					for (i = 0; i < 3; i++)
 						c->v[i] = MAX(0.0, MIN(space->max[i], c->v[i]));
 					goto changed;
-				}
-
-				int f;
-				if ((f = open("/dev/snarf", OWRITE)) >= 0) {
-					if (i == nelem(spaces))
-						write(f, hex, strlen(hex));
-					else
-						dump(f);
-					close(f);
+				} else if (i == menusnarf || i == menusnarfall) {
+					int f;
+					if ((f = open("/dev/snarf", OWRITE)) >= 0) {
+						if (i == menusnarf)
+							write(f, hex, strlen(hex));
+						else
+							dump(f);
+						close(f);
+					}
+				} else if (i == menurevert) {
+					space->fromrgb(c->rgba0, c->v);
+					goto changed;
+				} else if (i == menurevertall) {
+					for (c = colors; c != nil; c = c->next) {
+						memmove(c->rgba, c->rgba0, sizeof(c->rgba));
+						space->fromrgb(c->rgba, c->v);
+						space->torgb(c->v, c->rgba);
+						u = rgba2u(c->rgba);
+						if (c->u != u) {
+							c->u = u;
+							if (!once)
+								printcolor(1, c);
+							freeimage(c->i);
+							c->i = nil;
+						}
+					}
+					redraw();
+					break;
 				}
 			} else if (m.buttons == 2) {
 				strcpy(buf, hex);