Xinqi Bao's Git
1 /* See LICENSE file for copyright and license details. */
5 #include <X11/XKBlib.h>
11 valid_layout_or_variant(char *sym
)
14 /* invalid symbols from xkb rules config */
15 static const char *invalid
[] = { "evdev", "inet", "pc", "base" };
17 for (i
= 0; i
< LEN(invalid
); i
++) {
18 if (!strncmp(sym
, invalid
[i
], strlen(invalid
[i
]))) {
27 get_layout(char *syms
, int grp_num
)
33 tok
= strtok(syms
, "+:");
34 for (grp
= 0; tok
&& grp
<= grp_num
; tok
= strtok(NULL
, "+:")) {
35 if (!valid_layout_or_variant(tok
)) {
37 } else if (strlen(tok
) == 1 && isdigit(tok
[0])) {
38 /* ignore :2, :3, :4 (additional layout groups) */
54 char *symbols
, *layout
;
58 if (!(dpy
= XOpenDisplay(NULL
))) {
59 warn("XOpenDisplay: Failed to open display");
62 if (!(desc
= XkbAllocKeyboard())) {
63 warn("XkbAllocKeyboard: Failed to allocate keyboard");
66 if (XkbGetNames(dpy
, XkbSymbolsNameMask
, desc
)) {
67 warn("XkbGetNames: Failed to retrieve key symbols");
70 if (XkbGetState(dpy
, XkbUseCoreKbd
, &state
)) {
71 warn("XkbGetState: Failed to retrieve keyboard state");
74 if (!(symbols
= XGetAtomName(dpy
, desc
->names
->symbols
))) {
75 warn("XGetAtomName: Failed to get atom name");
78 layout
= (char *)bprintf("%s", get_layout(symbols
, state
.group
));
81 XkbFreeKeyboard(desc
, XkbSymbolsNameMask
, 1);
82 if (XCloseDisplay(dpy
)) {
83 warn("XCloseDisplay: Failed to close display");