Add flexible formatting to keyboard_indicators.

Updated for style.
This commit is contained in:
Ian Remmler 2018-06-03 20:02:34 -05:00 committed by Aaron Marcher
parent 005b541717
commit 32e0a2bfcc
2 changed files with 30 additions and 11 deletions

View File

@ -1,14 +1,26 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include "../util.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 * const char *
keyboard_indicators(void) keyboard_indicators(const char *fmt)
{ {
Display *dpy; Display *dpy;
XKeyboardState state; XKeyboardState state;
size_t fmtlen, i, n;
int togglecase, isset;
char key;
if (!(dpy = XOpenDisplay(NULL))) { if (!(dpy = XOpenDisplay(NULL))) {
warn("XOpenDisplay: Failed to open display"); warn("XOpenDisplay: Failed to open display");
@ -17,14 +29,20 @@ keyboard_indicators(void)
XGetKeyboardControl(dpy, &state); XGetKeyboardControl(dpy, &state);
XCloseDisplay(dpy); XCloseDisplay(dpy);
switch (state.led_mask) { fmtlen = strnlen(fmt, 4);
case 1: for (i = n = 0; i < fmtlen; i++) {
return "c"; key = tolower(fmt[i]);
case 2: if (key != 'c' && key != 'n') {
return "n"; continue;
case 3: }
return "cn"; togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?');
default: isset = (state.led_mask & (1 << (key == 'n')));
return ""; if (togglecase) {
buf[n++] = isset ? toupper(key) : key;
} else if (isset) {
buf[n++] = fmt[i];
} }
} }
buf[n] = 0;
return buf;
}

View File

@ -31,7 +31,8 @@ static const char unknown_str[] = "n/a";
* ipv4 IPv4 address interface name (eth0) * ipv4 IPv4 address interface name (eth0)
* ipv6 IPv6 address interface name (eth0) * ipv6 IPv6 address interface name (eth0)
* kernel_release `uname -r` NULL * 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 layout (variant) of current NULL
* keymap * keymap
* load_avg load average NULL * load_avg load average NULL