C 无法检测raspbian中的键盘语言(布局)
我有两个线程处理键盘。每个线程都可能更改键盘映射,并且必须通过此更改通知另一个线程。为了识别键盘语言的变化,我编写了以下函数:C 无法检测raspbian中的键盘语言(布局),c,linux,keyboard,raspberry-pi,xlib,C,Linux,Keyboard,Raspberry Pi,Xlib,我有两个线程处理键盘。每个线程都可能更改键盘映射,并且必须通过此更改通知另一个线程。为了识别键盘语言的变化,我编写了以下函数: char getKeyboardLang(Display *dpy) { int baseEventCode, baseErrorCode, opcode; int groupCount; int major = XkbMajorVersion; int minor = XkbMinorVersion; XkbQueryExt
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] ;
}
这个函数在Ubuntu14和16中非常有效。这意味着在命令setxkbmap-us
之后,此函数返回字符“E”(英语-美国),在命令setxkbmap-ir
之后返回“P”(波斯语)。但在raspbian(一种改进的debian for Raspberry pi board)中,即使在执行setxkbmap ir
之后,此函数也始终返回“E”
在Ubuntu中,当我运行setxkbmap-ir
时,键盘语言变为波斯语,setxkbmap-query
的输出为:
规则:evdev
型号:pc105
布局:ir
在拉斯宾语中奇怪的是,在setxkbmap-ir
之后,键盘语言变为波斯语,但setxkbmap-query
的输出表明它是英语us:
规则:evdev
型号:pc105
布局:美国
这样,我不知道如何才能在C程序中检测出raspbian中当前的键盘语言?我不确定,但我认为这可能与驱动程序有关?你能在debian而不是ubuntu上试用吗?为什么你要分配一个键盘(没有释放它,泄露!)?相反,请调用
XkbGetKeyboard
,在任何情况下,不要忘记调用xkbfreeboard
@Titulum:目前我无法访问debian系统。ubuntu和debian之间有这样的区别吗?@iMoses:谢谢你的观点:),但是你知道这里的主要问题吗?对不起@payman,但我不知道。否则我会回答而不是添加评论。