Introduction
Introduction Statistics Contact Development Disclaimer Help
keyboard_indicators.c - slstatus - status monitor
git clone git://git.suckless.org/slstatus
Log
Files
Refs
README
LICENSE
---
keyboard_indicators.c (1238B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <ctype.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <X11/Xlib.h>
6
7 #include "../slstatus.h"
8 #include "../util.h"
9
10 /*
11 * fmt consists of uppercase or lowercase 'c' for caps lock and/or 'n' f…
12 * lock, each optionally followed by '?', in the order of indicators des…
13 * If followed by '?', the letter with case preserved is included in the…
14 * if the corresponding indicator is on. Otherwise, the letter is always
15 * included, lowercase when off and uppercase when on.
16 */
17 const char *
18 keyboard_indicators(const char *fmt)
19 {
20 Display *dpy;
21 XKeyboardState state;
22 size_t fmtlen, i, n;
23 int togglecase, isset;
24 char key;
25
26 if (!(dpy = XOpenDisplay(NULL))) {
27 warn("XOpenDisplay: Failed to open display");
28 return NULL;
29 }
30 XGetKeyboardControl(dpy, &state);
31 XCloseDisplay(dpy);
32
33 fmtlen = strnlen(fmt, 4);
34 for (i = n = 0; i < fmtlen; i++) {
35 key = tolower(fmt[i]);
36 if (key != 'c' && key != 'n')
37 continue;
38
39 togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?');
40 isset = (state.led_mask & (1 << (key == 'n')));
41
42 if (togglecase)
43 buf[n++] = isset ? toupper(key) : key;
44 else if (isset)
45 buf[n++] = fmt[i];
46 }
47
48 buf[n] = 0;
49 return buf;
50 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.