我有两个使用键盘的线程。每个线程可能会更改键盘映射,另一个必须通过此更改通知。为了识别键盘语言的变化,我编写了以下函数:
char getKeyboardLang(Display *dpy)
{
int baseEventCode, baseErrorCode, opcode;
int groupCount;
int major = XkbMajorVersion;
int minor = XkbMinorVersion;
XkbQueryExtension(dpy, &opcode, &baseEventCode, &baseErrorCode, &major,
&minor);
XkbDescRec* kbdDescPtr = XkbAllocKeyboard();
if (kbdDescPtr == NULL) {
printf("Failed to get keyboard description.\n");
return -1;
}
kbdDescPtr->dpy = dpy;
kbdDescPtr->device_spec = XkbUseCoreKbd;
XkbGetControls(dpy, XkbAllControlsMask, kbdDescPtr);
XkbGetNames(dpy, XkbSymbolsNameMask, kbdDescPtr);
XkbGetNames(dpy, XkbGroupNamesMask, kbdDescPtr);
if (kbdDescPtr->names == NULL) {
printf("Failed to get keyboard description.\n");
return -1;
}
// Get the group names.
const Atom* tmpGroupSource = kbdDescPtr->names->groups;
//printf("%c\n", XGetAtomName(dpy, kbdDescPtr->names->groups[0])[0]);
return XGetAtomName(dpy, kbdDescPtr->names->groups[0])[0] ;
}
此函数在Ubuntu 14和16中完美运行。这意味着在命令setxkbmap us
之后,此函数返回字符“E”(英语版),在命令setxkbmap ir
之后返回“P” (波斯语)。但是在raspbian(Raspberry pi板的修改后的debian)中,即使执行了setxkbmap ir
,该函数也会返回'E'!
在我运行setxkbmap ir
时在Ubuntu中,键盘语言更改为波斯语,setxkbmap -query
的输出为:
规则:evdev
型号:pc105
布局:ir
在raspbian中的奇怪之处在于,在setxkbmap ir
之后,键盘的语言变为波斯语,但setxkbmap -query
的输出表明它是英语我们:
规则:evdev
型号:pc105
布局:我们
这样我就不知道怎样才能在C程序中检测出raspbian中当前的键盘语言?