slstatus

status monitor
git clone git://git.suckless.org/slstatus
Log | Files | Refs | README | LICENSE

commit 32e0a2bfcc7def9128fb7f385b603f2c5fe34e4d
parent 005b5417179de9eff56a9ac5f2ed818ae9ad5817
Author: Ian Remmler <ian@remmler.org>
Date:   Sun,  3 Jun 2018 20:02:34 -0500

Add flexible formatting to keyboard_indicators.

Updated for style.

Diffstat:
Mcomponents/keyboard_indicators.c | 38++++++++++++++++++++++++++++----------
Mconfig.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_indicators.c * keymap layout (variant) of current NULL * keymap * load_avg load average NULL