summaryrefslogtreecommitdiff
path: root/patches/slock-key-feedback.diff
blob: b479518465afa088d093551025cb8a4076ba48a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
diff --git a/config.def.h b/config.def.h
index 9855e21..29734e2 100644
--- a/config.def.h
+++ b/config.def.h
@@ -6,7 +6,23 @@ static const char *colorname[NUMCOLS] = {
 	[INIT] =   "black",     /* after initialization */
 	[INPUT] =  "#005577",   /* during input */
 	[FAILED] = "#CC3333",   /* wrong password */
+	[BLOCKS] = "#ffffff",   /* key feedback block */
 };
 
 /* treat a cleared input like a wrong password (color) */
 static const int failonclear = 1;
+
+
+// ### Blocks bar ###
+static short int blocks_enabled = 1; // 0 = don't show blocks
+static const int blocks_width = 0; // 0 = full width
+static const int blocks_height = 16;
+
+// position
+static const int blocks_x = 0;
+static const int blocks_y = 0;
+
+// Number of blocks
+static const int blocks_count = 10;
+// ### \Blocks bar ###
+
diff --git a/slock.c b/slock.c
index 5ae738c..cf52710 100644
--- a/slock.c
+++ b/slock.c
@@ -13,6 +13,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <time.h>
 #include <sys/types.h>
 #include <X11/extensions/Xrandr.h>
 #include <X11/keysym.h>
@@ -28,7 +29,8 @@ enum {
 	INIT,
 	INPUT,
 	FAILED,
-	NUMCOLS
+	BLOCKS,
+	NUMCOLS,
 };
 
 struct lock {
@@ -83,7 +85,40 @@ dontkillme(void)
 }
 #endif
 
-static const char *
+static void
+draw_key_feedback(Display *dpy, struct lock **locks, int screen)
+{
+	XGCValues gr_values;
+
+	Window win = locks[screen]->win;
+	Window root_win;
+
+	gr_values.foreground = locks[screen]->colors[BLOCKS];
+	GC gc = XCreateGC(dpy, win, GCForeground, &gr_values);
+
+	int width = blocks_width,
+			height = blocks_height,
+			x = blocks_x,
+			y = blocks_y;
+
+	if (height == 0 || width == 0) {
+		int _x, _y;
+		unsigned int screen_width, screen_height, _b, _d;
+		XGetGeometry(dpy, win, &root_win, &_x, &_y, &screen_width, &screen_height, &_b, &_d);
+		width = width ? width : screen_width;
+		height = height ? height : screen_height;
+	}
+
+	unsigned int block_width = width / blocks_count;
+	unsigned int position = rand() % blocks_count;
+
+	XClearWindow(dpy, win);
+	XFillRectangle(dpy, win, gc, x + position*block_width, y, block_width, height);
+
+	XFreeGC(dpy, gc);
+}
+
+	static const char *
 gethash(void)
 {
 	const char *hash;
@@ -185,6 +220,9 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
 					memcpy(passwd + len, buf, num);
 					len += num;
 				}
+				if (blocks_enabled)
+					for (screen = 0; screen < nscreens; screen++)
+						draw_key_feedback(dpy, locks, screen);
 				break;
 			}
 			color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
@@ -355,6 +393,10 @@ main(int argc, char **argv) {
 	if (setuid(duid) < 0)
 		die("slock: setuid: %s\n", strerror(errno));
 
+	time_t t;
+	srand((unsigned) time(&t));
+
+
 	/* check for Xrandr support */
 	rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);