summaryrefslogtreecommitdiff
path: root/patches/slock-key-feedback.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/slock-key-feedback.diff')
-rw-r--r--patches/slock-key-feedback.diff113
1 files changed, 113 insertions, 0 deletions
diff --git a/patches/slock-key-feedback.diff b/patches/slock-key-feedback.diff
new file mode 100644
index 0000000..b479518
--- /dev/null
+++ b/patches/slock-key-feedback.diff
@@ -0,0 +1,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);
+