Add flexible formatting to keyboard_indicators.
Updated for style.
This commit is contained in:
		
				
					committed by
					
						
						Aaron Marcher
					
				
			
			
				
	
			
			
			
						parent
						
							005b541717
						
					
				
				
					commit
					32e0a2bfcc
				
			@@ -1,14 +1,26 @@
 | 
				
			|||||||
/* See LICENSE file for copyright and license details. */
 | 
					/* See LICENSE file for copyright and license details. */
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
#include <X11/Xlib.h>
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../util.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 *
 | 
					const char *
 | 
				
			||||||
keyboard_indicators(void)
 | 
					keyboard_indicators(const char *fmt)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Display *dpy;
 | 
						Display *dpy;
 | 
				
			||||||
	XKeyboardState state;
 | 
						XKeyboardState state;
 | 
				
			||||||
 | 
						size_t fmtlen, i, n;
 | 
				
			||||||
 | 
						int togglecase, isset;
 | 
				
			||||||
 | 
						char key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(dpy = XOpenDisplay(NULL))) {
 | 
						if (!(dpy = XOpenDisplay(NULL))) {
 | 
				
			||||||
		warn("XOpenDisplay: Failed to open display");
 | 
							warn("XOpenDisplay: Failed to open display");
 | 
				
			||||||
@@ -17,14 +29,20 @@ keyboard_indicators(void)
 | 
				
			|||||||
	XGetKeyboardControl(dpy, &state);
 | 
						XGetKeyboardControl(dpy, &state);
 | 
				
			||||||
	XCloseDisplay(dpy);
 | 
						XCloseDisplay(dpy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (state.led_mask) {
 | 
						fmtlen = strnlen(fmt, 4);
 | 
				
			||||||
	case 1:
 | 
						for (i = n = 0; i < fmtlen; i++) {
 | 
				
			||||||
		return "c";
 | 
							key = tolower(fmt[i]);
 | 
				
			||||||
	case 2:
 | 
							if (key != 'c' && key != 'n') {
 | 
				
			||||||
		return "n";
 | 
								continue;
 | 
				
			||||||
	case 3:
 | 
							}
 | 
				
			||||||
		return "cn";
 | 
							togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?');
 | 
				
			||||||
	default:
 | 
							isset = (state.led_mask & (1 << (key == 'n')));
 | 
				
			||||||
		return "";
 | 
							if (togglecase) {
 | 
				
			||||||
 | 
								buf[n++] = isset ? toupper(key) : key;
 | 
				
			||||||
 | 
							} else if (isset) {
 | 
				
			||||||
 | 
								buf[n++] = fmt[i];
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						buf[n] = 0;
 | 
				
			||||||
 | 
						return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,8 @@ static const char unknown_str[] = "n/a";
 | 
				
			|||||||
 * ipv4                 IPv4 address                    interface name (eth0)
 | 
					 * ipv4                 IPv4 address                    interface name (eth0)
 | 
				
			||||||
 * ipv6                 IPv6 address                    interface name (eth0)
 | 
					 * ipv6                 IPv6 address                    interface name (eth0)
 | 
				
			||||||
 * kernel_release       `uname -r`                      NULL
 | 
					 * 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               layout (variant) of current     NULL
 | 
				
			||||||
 *                      keymap
 | 
					 *                      keymap
 | 
				
			||||||
 * load_avg             load average                    NULL
 | 
					 * load_avg             load average                    NULL
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user