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);
|