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

From: Ian Remmler <ian_AT_remmler.org>
Date: Thu, 31 May 2018 19:50:04 -0500

Add output formatting for keyboard indicators, allowing the user to
specify order and whether to only show an indicator when it is on or
always show it and use case to indicate state.

---
 components/keyboard_indicators.c | 39 ++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 10 deletions(-)
diff --git a/components/keyboard_indicators.c b/components/keyboard_indicators.c
index 73ba32e..e6f1b98 100644
--- a/components/keyboard_indicators.c
+++ b/components/keyboard_indicators.c
_AT_@ -1,14 +1,29 @@
 /* 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;
+	size_t i;
+	size_t n = 0;
+	int togglecase;
+	int isset;
+	char key;
 
 	if (!(dpy = XOpenDisplay(NULL))) {
 		warn("XOpenDisplay: Failed to open display");
_AT_@ -17,14 +32,18 @@ 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 = 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;
 }
-- 
	- Ian.
Received on Fri Jun 01 2018 - 02:50:04 CEST

This archive was generated by hypermail 2.3.0 : Fri Jun 01 2018 - 03:00:25 CEST