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,但我不知道。否则我会回答而不是添加评论。