commit c07648d3f9226db04db0711fc62693f5317e9609
parent 4b280b29ef50782e5b0dfba7112a55865b4748a2
Author: bakkeby <bakkeby@gmail.com>
Date: Mon, 3 Aug 2020 15:53:34 +0200
Adding keypress_feedback patch
Diffstat:
8 files changed, 87 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
@@ -15,6 +15,8 @@ Refer to [https://tools.suckless.org/slock/](https://tools.suckless.org/slock/)
### Changelog:
+2020-08-03 - Added keypress_feedback patch
+
2019-11-27 - Added xresources patch
2019-10-17 - Added capscolor, control clear, dpms, mediakeys, message, pam auth, quickcancel patches
@@ -34,6 +36,9 @@ Refer to [https://tools.suckless.org/slock/](https://tools.suckless.org/slock/)
- interacts with the Display Power Signaling and automatically shuts down the monitor after a configurable amount of seconds
- the monitor will automatically be activated by pressing a key or moving the mouse and the password can be entered then
+ - [keypress_feedback](https://tools.suckless.org/slock/patches/keypress-feedback/)
+ - draws random blocks on the screen to display keypress feedback
+
- [mediakeys](https://tools.suckless.org/slock/patches/mediakeys/)
- allows media keys to be used while the screen is locked, e.g. adjust volume or skip to the next song without having to unlock the screen first
diff --git a/config.def.h b/config.def.h
@@ -12,6 +12,9 @@ static const char *colorname[NUMCOLS] = {
#if PAMAUTH_PATCH
[PAM] = "#9400D3", /* waiting for PAM */
#endif // PAMAUTH_PATCH
+ #if KEYPRESS_FEEDBACK_PATCH
+ [BLOCKS] = "#ffffff", /* key feedback block */
+ #endif // KEYPRESS_FEEDBACK_PATCH
};
#if XRESOURCES_PATCH
@@ -44,6 +47,19 @@ static const int controlkeyclear = 0;
static const int monitortime = 5;
#endif // DPMS_PATCH
+#if KEYPRESS_FEEDBACK_PATCH
+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;
+#endif // KEYPRESS_FEEDBACK_PATCH
+
#if MESSAGE_PATCH
/* default message */
static const char * message = "Suckless: Software that sucks less.";
diff --git a/patch/include.c b/patch/include.c
@@ -3,6 +3,10 @@
#include "message.c"
#endif
+#if KEYPRESS_FEEDBACK_PATCH
+#include "keypress_feedback.c"
+#endif
+
#if PAMAUTH_PATCH
#include "pamauth.c"
#endif
diff --git a/patch/include.h b/patch/include.h
@@ -3,6 +3,10 @@
#include "pamauth.h"
#endif
+#if KEYPRESS_FEEDBACK_PATCH
+#include "keypress_feedback.h"
+#endif
+
#if XRESOURCES_PATCH
#include "xresources.h"
#endif
\ No newline at end of file
diff --git a/patch/keypress_feedback.c b/patch/keypress_feedback.c
@@ -0,0 +1,28 @@
+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;
+ if (blocks_height == 0 || blocks_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 = blocks_width ? blocks_width : screen_width;
+ height = blocks_height ? blocks_height : screen_height;
+ }
+
+ unsigned int block_width = width / blocks_count;
+ unsigned int position = rand() % blocks_count;
+
+ XClearWindow(dpy, win);
+ XFillRectangle(dpy, win, gc, blocks_x + position*block_width, blocks_y, width, height);
+
+ XFreeGC(dpy, gc);
+}
+\ No newline at end of file
diff --git a/patch/keypress_feedback.h b/patch/keypress_feedback.h
@@ -0,0 +1 @@
+static void draw_key_feedback(Display *dpy, struct lock **locks, int screen);
+\ No newline at end of file
diff --git a/patches.def.h b/patches.def.h
@@ -23,13 +23,19 @@
#define CONTROLCLEAR_PATCH 0
/* This patch interacts with the Display Power Signaling and automatically shuts down
-* the monitor after a configurable amount of seconds.
-* The monitor will automatically be activated by pressing a key or moving the mouse
-* and the password can be entered then.
-* https://tools.suckless.org/slock/patches/dpms/
-*/
+ * the monitor after a configurable amount of seconds.
+ * The monitor will automatically be activated by pressing a key or moving the mouse
+ * and the password can be entered then.
+ * https://tools.suckless.org/slock/patches/dpms/
+ */
#define DPMS_PATCH 0
+/* Draws random blocks on the screen to display keypress feedback.
+ * https://tools.suckless.org/slock/patches/keypress-feedback/
+ * https://patch-diff.githubusercontent.com/raw/phenax/bslock/pull/2.diff
+ */
+#define KEYPRESS_FEEDBACK_PATCH 0
+
/* This patch allows media keys to be used while the screen is locked. Allows for volume
* to be adjusted or to skip to the next song without having to unlock the screen first.
* https://tools.suckless.org/slock/patches/mediakeys/
diff --git a/slock.c b/slock.c
@@ -20,6 +20,9 @@
#include <X11/Xutil.h>
#include "patches.h"
+#if KEYPRESS_FEEDBACK_PATCH
+#include <time.h>
+#endif // KEYPRESS_FEEDBACK_PATCH
#if CAPSCOLOR_PATCH
#include <X11/XKBlib.h>
#endif // CAPSCOLOR_PATCH
@@ -52,6 +55,9 @@ enum {
#if PAMAUTH_PATCH
PAM,
#endif // PAMAUTH_PATCH
+ #if KEYPRESS_FEEDBACK_PATCH
+ BLOCKS,
+ #endif // KEYPRESS_FEEDBACK_PATCH
NUMCOLS
};
@@ -301,6 +307,11 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
memcpy(passwd + len, buf, num);
len += num;
}
+ #if KEYPRESS_FEEDBACK_PATCH
+ if (blocks_enabled)
+ for (screen = 0; screen < nscreens; screen++)
+ draw_key_feedback(dpy, locks, screen);
+ #endif // KEYPRESS_FEEDBACK_PATCH
break;
}
#if CAPSCOLOR_PATCH
@@ -521,6 +532,11 @@ main(int argc, char **argv) {
config_init(dpy);
#endif // XRESOURCES_PATCH
+ #if KEYPRESS_FEEDBACK_PATCH
+ time_t t;
+ srand((unsigned) time(&t));
+ #endif // KEYPRESS_FEEDBACK_PATCH
+
/* check for Xrandr support */
rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);