[hackers] [slstatus][PATCH] Add flexible formatting to keyboard_indicators.

From: Ian Remmler <ian_AT_remmler.org>
Date: Sun, 3 Jun 2018 20:02:34 -0500

Updated for style.

---
 components/keyboard_indicators.c | 38 +++++++++++++++++++++++---------
 config.def.h                     |  3 ++-
 2 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/components/keyboard_indicators.c b/components/keyboard_indicators.c
index 73ba32e..b35eba1 100644
--- a/components/keyboard_indicators.c
+++ b/components/keyboard_indicators.c
_AT_@ -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");
_AT_@ -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
index 58e935a..4474508 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -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
-- 
	- Ian.
Received on Mon Jun 04 2018 - 03:02:34 CEST

This archive was generated by hypermail 2.3.0 : Mon Jun 04 2018 - 03:12:18 CEST