Add flexible formatting to keyboard_indicators. - slstatus - status monitor | |
git clone git://git.suckless.org/slstatus | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 32e0a2bfcc7def9128fb7f385b603f2c5fe34e4d | |
parent 005b5417179de9eff56a9ac5f2ed818ae9ad5817 | |
Author: Ian Remmler <[email protected]> | |
Date: Sun, 3 Jun 2018 20:02:34 -0500 | |
Add flexible formatting to keyboard_indicators. | |
Updated for style. | |
Diffstat: | |
M components/keyboard_indicators.c | 38 +++++++++++++++++++++++------… | |
M config.def.h | 3 ++- | |
2 files changed, 30 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/components/keyboard_indicators.c b/components/keyboard_indicators.c | |
@@ -1,14 +1,26 @@ | |
/* See LICENSE file for copyright and license details. */ | |
+#include <ctype.h> | |
#include <stdio.h> | |
+#include <string.h> | |
#include <X11/Xlib.h> | |
#include "../util.h" | |
+/* | |
+ * fmt consists of uppercase or lowercase 'c' for caps lock and/or 'n' for num | |
+ * lock, each optionally followed by '?', in the order of indicators desired. | |
+ * If followed by '?', the letter with case preserved is included in the output | |
+ * if the corresponding indicator is on. Otherwise, the letter is always | |
+ * included, lowercase when off and uppercase when on. | |
+ */ | |
const char * | |
-keyboard_indicators(void) | |
+keyboard_indicators(const char *fmt) | |
{ | |
Display *dpy; | |
XKeyboardState state; | |
+ size_t fmtlen, i, n; | |
+ int togglecase, isset; | |
+ char key; | |
if (!(dpy = XOpenDisplay(NULL))) { | |
warn("XOpenDisplay: Failed to open display"); | |
@@ -17,14 +29,20 @@ keyboard_indicators(void) | |
XGetKeyboardControl(dpy, &state); | |
XCloseDisplay(dpy); | |
- switch (state.led_mask) { | |
- case 1: | |
- return "c"; | |
- case 2: | |
- return "n"; | |
- case 3: | |
- return "cn"; | |
- default: | |
- return ""; | |
+ fmtlen = strnlen(fmt, 4); | |
+ for (i = n = 0; i < fmtlen; i++) { | |
+ key = tolower(fmt[i]); | |
+ if (key != 'c' && key != 'n') { | |
+ continue; | |
+ } | |
+ togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?'); | |
+ isset = (state.led_mask & (1 << (key == 'n'))); | |
+ if (togglecase) { | |
+ buf[n++] = isset ? toupper(key) : key; | |
+ } else if (isset) { | |
+ buf[n++] = fmt[i]; | |
+ } | |
} | |
+ buf[n] = 0; | |
+ return buf; | |
} | |
diff --git a/config.def.h b/config.def.h | |
@@ -31,7 +31,8 @@ static const char unknown_str[] = "n/a"; | |
* ipv4 IPv4 address interface name (eth0) | |
* ipv6 IPv6 address interface name (eth0) | |
* kernel_release `uname -r` NULL | |
- * keyboard_indicators caps/num lock indicators NULL | |
+ * keyboard_indicators caps/num lock indicators format string (c?n?) | |
+ * see keyboard_indicator… | |
* keymap layout (variant) of current NULL | |
* keymap | |
* load_avg load average NULL |