Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Get keyboard layout using X11
// compile with `gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile`
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>
int main(int argc, char **argv) {
Display *dpy = XOpenDisplay(NULL);
if (dpy == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
XkbStateRec state;
XkbGetState(dpy, XkbUseCoreKbd, &state);
XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
printf("Full name: %s\n", group);
XkbRF_VarDefsRec vd;
XkbRF_GetNamesProp(dpy, NULL, &vd);
char *tok = strtok(vd.layout, ",");
for (int i = 0; i < state.group; i++) {
tok = strtok(NULL, ",");
if (tok == NULL) {
return 1;
}
}
printf("Layout name: %s\n", tok);
return 0;
}
@su8

This comment has been minimized.

Copy link

@su8 su8 commented Apr 1, 2018

Thanks for sharing it to stackoverflow.

@su8

This comment has been minimized.

Copy link

@su8 su8 commented Apr 1, 2018

You are missing XFree(group); and XCloseDisplay(dpy); at the end, just before return 0;.

@kulak

This comment has been minimized.

Copy link

@kulak kulak commented Jan 1, 2021

it works well (returns Russian and US layouts in XFCE). works great.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment