Adding key_indicator that shows the status of 'Caps Lock', 'Num Lock'
and 'Scroll Lock' in i3status output.
This commit is contained in:
parent
d53da19a79
commit
dd3db16c10
2
.gitignore
vendored
2
.gitignore
vendored
@ -8,3 +8,5 @@ man/i3status.1
|
|||||||
# it is up to you to arrange for it to be ignored by git,
|
# it is up to you to arrange for it to be ignored by git,
|
||||||
# e.g. by listing your directory in .git/info/exclude.
|
# e.g. by listing your directory in .git/info/exclude.
|
||||||
/build
|
/build
|
||||||
|
|
||||||
|
.vscode
|
||||||
|
24
i3status.c
24
i3status.c
@ -443,6 +443,18 @@ int main(int argc, char *argv[]) {
|
|||||||
CFG_CUSTOM_SEP_BLOCK_WIDTH_OPT,
|
CFG_CUSTOM_SEP_BLOCK_WIDTH_OPT,
|
||||||
CFG_END()};
|
CFG_END()};
|
||||||
|
|
||||||
|
cfg_opt_t key_indicator_opts[] = {
|
||||||
|
CFG_STR("format", "%content", CFGF_NONE),
|
||||||
|
CFG_STR("format_bad", "%title - %errno: %error", CFGF_NONE),
|
||||||
|
CFG_STR("path", NULL, CFGF_NONE),
|
||||||
|
CFG_INT("max_characters", 255, CFGF_NONE),
|
||||||
|
CFG_CUSTOM_ALIGN_OPT,
|
||||||
|
CFG_CUSTOM_COLOR_OPTS,
|
||||||
|
CFG_CUSTOM_MIN_WIDTH_OPT,
|
||||||
|
CFG_CUSTOM_SEPARATOR_OPT,
|
||||||
|
CFG_CUSTOM_SEP_BLOCK_WIDTH_OPT,
|
||||||
|
CFG_END()};
|
||||||
|
|
||||||
cfg_opt_t read_opts[] = {
|
cfg_opt_t read_opts[] = {
|
||||||
CFG_STR("format", "%content", CFGF_NONE),
|
CFG_STR("format", "%content", CFGF_NONE),
|
||||||
CFG_STR("format_bad", "%title - %errno: %error", CFGF_NONE),
|
CFG_STR("format_bad", "%title - %errno: %error", CFGF_NONE),
|
||||||
@ -473,6 +485,7 @@ int main(int argc, char *argv[]) {
|
|||||||
CFG_SEC("load", load_opts, CFGF_NONE),
|
CFG_SEC("load", load_opts, CFGF_NONE),
|
||||||
CFG_SEC("memory", memory_opts, CFGF_NONE),
|
CFG_SEC("memory", memory_opts, CFGF_NONE),
|
||||||
CFG_SEC("cpu_usage", usage_opts, CFGF_NONE),
|
CFG_SEC("cpu_usage", usage_opts, CFGF_NONE),
|
||||||
|
CFG_SEC("key_indicator", key_indicator_opts, CFGF_NONE),
|
||||||
CFG_SEC("read_file", read_opts, CFGF_TITLE | CFGF_MULTI),
|
CFG_SEC("read_file", read_opts, CFGF_TITLE | CFGF_MULTI),
|
||||||
CFG_END()};
|
CFG_END()};
|
||||||
|
|
||||||
@ -932,6 +945,17 @@ int main(int argc, char *argv[]) {
|
|||||||
SEC_CLOSE_MAP;
|
SEC_CLOSE_MAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CASE_SEC("key_indicator") {
|
||||||
|
SEC_OPEN_MAP("key_indicator");
|
||||||
|
key_indicator_ctx_t ctx = {
|
||||||
|
.json_gen = json_gen,
|
||||||
|
.buf = buffer,
|
||||||
|
.buflen = sizeof(buffer),
|
||||||
|
};
|
||||||
|
print_key_indicator(&ctx);
|
||||||
|
SEC_CLOSE_MAP;
|
||||||
|
}
|
||||||
|
|
||||||
CASE_SEC_TITLE("read_file") {
|
CASE_SEC_TITLE("read_file") {
|
||||||
SEC_OPEN_MAP("read_file");
|
SEC_OPEN_MAP("read_file");
|
||||||
file_contents_ctx_t ctx = {
|
file_contents_ctx_t ctx = {
|
||||||
|
@ -424,6 +424,14 @@ typedef struct {
|
|||||||
|
|
||||||
void print_volume(volume_ctx_t *ctx);
|
void print_volume(volume_ctx_t *ctx);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
yajl_gen json_gen;
|
||||||
|
char *buf;
|
||||||
|
const size_t buflen;
|
||||||
|
} key_indicator_ctx_t;
|
||||||
|
|
||||||
|
void print_key_indicator(key_indicator_ctx_t *ctx);
|
||||||
|
|
||||||
bool process_runs(const char *path);
|
bool process_runs(const char *path);
|
||||||
int volume_pulseaudio(uint32_t sink_idx, const char *sink_name);
|
int volume_pulseaudio(uint32_t sink_idx, const char *sink_name);
|
||||||
bool description_pulseaudio(uint32_t sink_idx, const char *sink_name, char buffer[MAX_SINK_DESCRIPTION_LEN]);
|
bool description_pulseaudio(uint32_t sink_idx, const char *sink_name, char buffer[MAX_SINK_DESCRIPTION_LEN]);
|
||||||
|
@ -144,6 +144,7 @@ add_project_arguments('-D_GNU_SOURCE', language: 'c')
|
|||||||
# https://mesonbuild.com/howtox.html#add-math-library-lm-portably
|
# https://mesonbuild.com/howtox.html#add-math-library-lm-portably
|
||||||
m_dep = cc.find_library('m', required: false)
|
m_dep = cc.find_library('m', required: false)
|
||||||
rt_dep = cc.find_library('rt', required: false)
|
rt_dep = cc.find_library('rt', required: false)
|
||||||
|
x_dep = cc.find_library('X11', required: true)
|
||||||
|
|
||||||
confuse_dep = dependency('libconfuse', method: 'pkg-config')
|
confuse_dep = dependency('libconfuse', method: 'pkg-config')
|
||||||
yajl_dep = dependency('yajl', method: 'pkg-config')
|
yajl_dep = dependency('yajl', method: 'pkg-config')
|
||||||
@ -170,8 +171,10 @@ i3status_srcs = [
|
|||||||
'src/print_time.c',
|
'src/print_time.c',
|
||||||
'src/print_volume.c',
|
'src/print_volume.c',
|
||||||
'src/print_wireless_info.c',
|
'src/print_wireless_info.c',
|
||||||
|
'src/print_key_indicator.c',
|
||||||
'src/print_file_contents.c',
|
'src/print_file_contents.c',
|
||||||
'src/process_runs.c',
|
'src/process_runs.c',
|
||||||
|
'src/print_key_indicator.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
thread_dep = dependency('threads')
|
thread_dep = dependency('threads')
|
||||||
@ -180,6 +183,7 @@ i3status_deps = [
|
|||||||
thread_dep,
|
thread_dep,
|
||||||
m_dep,
|
m_dep,
|
||||||
rt_dep,
|
rt_dep,
|
||||||
|
x_dep,
|
||||||
confuse_dep,
|
confuse_dep,
|
||||||
yajl_dep,
|
yajl_dep,
|
||||||
config_h,
|
config_h,
|
||||||
@ -202,7 +206,7 @@ if host_os == 'netbsd'
|
|||||||
i3status_deps += [prop_dep]
|
i3status_deps += [prop_dep]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
inc = include_directories('include')
|
inc = include_directories('include', '/usr/include/')
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
'i3status',
|
'i3status',
|
||||||
|
46
src/print_key_indicator.c
Normal file
46
src/print_key_indicator.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <yajl/yajl_gen.h>
|
||||||
|
#include <yajl/yajl_version.h>
|
||||||
|
|
||||||
|
#include <X11/extensions/XKB.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
|
|
||||||
|
#include "i3status.h"
|
||||||
|
|
||||||
|
#define NUM_INDS 3
|
||||||
|
#define STRING_SIZE 6
|
||||||
|
|
||||||
|
void print_key_indicator(key_indicator_ctx_t *ctx) {
|
||||||
|
|
||||||
|
char *outwalk = ctx->buf;
|
||||||
|
char *ind_names[NUM_INDS] = {"Num Lock", "Caps Lock", "Scroll Lock"};
|
||||||
|
char indicator_string[STRING_SIZE];
|
||||||
|
char indicator_chars[3];
|
||||||
|
int i;
|
||||||
|
int ndx = 0;
|
||||||
|
|
||||||
|
Atom iatoms[NUM_INDS] = {0};
|
||||||
|
Bool state[NUM_INDS] = {0};
|
||||||
|
|
||||||
|
Display *dpy = XOpenDisplay(NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_INDS; i++) {
|
||||||
|
iatoms[i] = XInternAtom(dpy, ind_names[i], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_INDS; i++) {
|
||||||
|
XkbGetNamedIndicator(dpy, iatoms[i], &ndx, &state[i], NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
indicator_chars[0] = state[0] ? 'N' : 'n';
|
||||||
|
indicator_chars[1] = state[1] ? 'C' : 'c';
|
||||||
|
indicator_chars[2] = state[2] ? 'S' : 's';
|
||||||
|
|
||||||
|
snprintf(indicator_string, STRING_SIZE, "%c %c %c", indicator_chars[0], indicator_chars[1], indicator_chars[2]);
|
||||||
|
|
||||||
|
OUTPUT_FULL_TEXT(indicator_string);
|
||||||
|
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user