diff options
author | Camil Staps | 2017-02-20 10:06:38 +0100 |
---|---|---|
committer | Camil Staps | 2017-02-20 10:06:38 +0100 |
commit | 73ae3a47a410eb2db9c3c776c0252e1feaeb2d7e (patch) | |
tree | 4835551f5d769ede433ed390d3cfc2406975480c /i3/bin/kbdlayout.c | |
parent | Cloogle stats in status bar (diff) |
Reorganise binaries
Diffstat (limited to 'i3/bin/kbdlayout.c')
-rw-r--r-- | i3/bin/kbdlayout.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/i3/bin/kbdlayout.c b/i3/bin/kbdlayout.c new file mode 100644 index 0000000..bb030bb --- /dev/null +++ b/i3/bin/kbdlayout.c @@ -0,0 +1,54 @@ +#include <X11/XKBlib.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +char* getActiveLayout(char* names, unsigned char active) { + int i; + for (i = 0; names[i]; i++) { + if (names[i] == '+') { + if (active <= 0) { + int j = ++i; + for (; names[j] && names[j] != '+' && names[j] != ':'; j++); + char* ret = malloc(j - i + 1); + strncpy(ret, names + i, j - i); + ret[j - i] = '\0'; + return ret; + } else { + active--; + } + } + } + return NULL; +} + +int main(void) { + int evCode, errRet, rsnRet; + int maj = XkbMajorVersion; + int min = XkbMinorVersion; + + Display* disp = XkbOpenDisplay("", &evCode, &errRet, &maj, &min, &rsnRet); + + // State + XkbStatePtr state = calloc(1, sizeof(XkbStateRec)); + XkbGetState(disp, 0x100, state); + + // Names + XkbDescPtr desc = XkbAllocKeyboard(); + XkbGetNames(disp, XkbSymbolsNameMask, desc); + + Atom symNameAtom = desc->names->symbols; + char* layouts = XGetAtomName(disp, symNameAtom); + + printf("%s\n", getActiveLayout(layouts, state->group)); + + unsigned int mask = XkbStateNotifyMask; + XkbSelectEvents(disp, XkbUseCoreKbd, mask, mask); + + XkbEvent event; + while (1) { + XNextEvent(disp, &event.core); + if (event.state.changed & 0x90) + printf("%s\n", getActiveLayout(layouts, event.state.group)); + } +} |