URI: 
       Add flexible formatting to keyboard_indicators. - slstatus - status monitor
  HTML git clone git://git.suckless.org/slstatus
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 32e0a2bfcc7def9128fb7f385b603f2c5fe34e4d
   DIR parent 005b5417179de9eff56a9ac5f2ed818ae9ad5817
  HTML 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:
         M components/keyboard_indicators.c    |      38 +++++++++++++++++++++++--------
         M config.def.h                        |       3 ++-
       
       2 files changed, 30 insertions(+), 11 deletions(-)
       ---
   DIR 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;
        }
   DIR 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