aboutsummaryrefslogtreecommitdiff
path: root/i3/bin/kbdlayout.c
diff options
context:
space:
mode:
authorCamil Staps2017-02-20 10:06:38 +0100
committerCamil Staps2017-02-20 10:06:38 +0100
commit73ae3a47a410eb2db9c3c776c0252e1feaeb2d7e (patch)
tree4835551f5d769ede433ed390d3cfc2406975480c /i3/bin/kbdlayout.c
parentCloogle stats in status bar (diff)
Reorganise binaries
Diffstat (limited to 'i3/bin/kbdlayout.c')
-rw-r--r--i3/bin/kbdlayout.c54
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));
+ }
+}