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