| 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 |