Xinqi Bao's Git
358a2cab64b7d15026bb07806c645ff27c642c9a
1 /* See LICENSE file for copyright and license details. */
5 #include <X11/XKBlib.h>
10 #define LAYOUT_MAX 256
12 /* Given a token (sym) from the xkb_symbols string
13 * check whether it is a valid layout/variant. The
14 * EXCLUDES array contains invalid layouts/variants
15 * that are part of the xkb rules config.
18 IsLayoutOrVariant(char *sym
)
20 static const char* EXCLUDES
[] = { "evdev", "inet", "pc", "base" };
23 for (i
= 0; i
< sizeof(EXCLUDES
)/sizeof(EXCLUDES
[0]); ++i
)
24 if (strstr(sym
, EXCLUDES
[i
])) {
32 GetKeyLayout(char *syms
, char layout
[], int groupNum
)
34 char *token
, *copy
, *delims
;
40 token
= strtok(copy
, delims
);
41 while (token
!= NULL
&& group
<= groupNum
) {
42 /* Ignore :2,:3,:4 which represent additional layout
45 if (IsLayoutOrVariant(token
)
46 && !(strlen(token
) == 1 && isdigit(token
[0]))) {
47 strncpy (layout
, token
, LAYOUT_MAX
);
51 token
= strtok(NULL
,delims
);
60 static char layout
[LAYOUT_MAX
];
64 XkbDescRec
* desc
= NULL
;
66 memset(layout
, '\0', LAYOUT_MAX
);
68 if (!(dpy
= XOpenDisplay(NULL
))) {
69 warn("XOpenDisplay: Failed to open display");
74 if (!(desc
= XkbAllocKeyboard())) {
75 warn("XkbAllocKeyboard: failed to allocate keyboard");
80 XkbGetNames(dpy
, XkbSymbolsNameMask
, desc
);
83 XkbGetState(dpy
, XkbUseCoreKbd
, &state
);
85 symbols
= XGetAtomName(dpy
, desc
->names
->symbols
);
86 GetKeyLayout(symbols
, layout
, state
.group
);
89 warn("XkbGetNames: failed to retrieve symbols for keys");
93 XkbFreeKeyboard(desc
, XkbSymbolsNameMask
, 1);