Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.