tAdd support for X keyboard layout - spoon - dwm status utility (2f30 fork) (HTM) git clone git://src.adamsgaard.dk/spoon (DIR) Log (DIR) Files (DIR) Refs (DIR) LICENSE --- (DIR) commit 6a3a2b7d107daccf3d0ee2a3d53b76b246dd6422 (DIR) parent 12b21d085d2e8d56034a7047dc1bcf60f49d46e8 (HTM) Author: lostd <lostd@2f30.org> Date: Sat, 14 May 2016 18:52:42 +0100 Add support for X keyboard layout Diffstat: M spoon.c | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+), 0 deletions(-) --- (DIR) diff --git a/spoon.c b/spoon.c t@@ -9,12 +9,16 @@ #include <machine/apmvar.h> +#include <X11/XKBlib.h> +#include <X11/extensions/XKBrules.h> + #define LEN(x) (sizeof (x) / sizeof *(x)) int dummyread(char *buf, size_t len); int mpdread(char *buf, size_t len); int battread(char *buf, size_t len); int dateread(char *buf, size_t len); +int xkblayoutread(char *buf, size_t len); struct ent { char *fmt; t@@ -24,6 +28,8 @@ struct ent { { .fmt = " ", .read = dummyread }, { .fmt = "%s%%", .read = battread }, { .fmt = " ", .read = dummyread }, + { .fmt = "[%s]", .read = xkblayoutread }, + { .fmt = " ", .read = dummyread }, { .fmt = "%s", .read = dateread }, }; t@@ -79,6 +85,44 @@ dateread(char *buf, size_t len) return 0; } +int +xkblayoutread(char *buf, size_t len) +{ + Display *dpy; + XkbStateRec state; + XkbRF_VarDefsRec vd; + char *tmp, *str, *tok; + int i, ret = 0; + + dpy = XOpenDisplay(NULL); + if (dpy == NULL) { + warnx("cannot open display"); + return -1; + } + XkbGetState(dpy, XkbUseCoreKbd, &state); + XkbRF_GetNamesProp(dpy, &tmp, &vd); + str = strdup(vd.layout); + if (str == NULL) { + ret = -1; + goto out0; + } + tok = strtok(str, ","); + for (i = 0; i < state.group; i++) { + tok = strtok(NULL, ","); + if (tok == NULL) { + warnx("cannot extract layout"); + ret = -1; + goto out1; + } + } + strlcpy(buf, tok, len); +out1: + free(str); +out0: + XCloseDisplay(dpy); + return ret; +} + void entcat(char *line, size_t len) {