Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从XCB中的密钥名称获取密钥代码?_Linux_X11_Xcb - Fatal编程技术网

Linux 从XCB中的密钥名称获取密钥代码?

Linux 从XCB中的密钥名称获取密钥代码?,linux,x11,xcb,Linux,X11,Xcb,我目前正在使用一个小型XCB应用程序,但我很难找到以下例程的替代方案: XKeysymToKeycode(display, XStringToKeysym("Tab")) 我设法通过xmodmap-pke获得了keycode,并将其硬编码到应用程序中,但我很确定这会给我带来问题(不同的硬件?不同的发行版?) 有没有办法从XCB中的名称获取密钥码?我确信您要查找的库是libxkbcommon: 我相信您正在寻找的函数可能是xkb\u state\u key\u get\u one\u sym:

我目前正在使用一个小型XCB应用程序,但我很难找到以下例程的替代方案:

XKeysymToKeycode(display, XStringToKeysym("Tab"))
我设法通过
xmodmap-pke
获得了keycode,并将其硬编码到应用程序中,但我很确定这会给我带来问题(不同的硬件?不同的发行版?)


有没有办法从XCB中的名称获取密钥码?

我确信您要查找的库是libxkbcommon:

我相信您正在寻找的函数可能是
xkb\u state\u key\u get\u one\u sym
: 此函数获取键盘状态和键代码,并提供键符号

编辑:哎呀,对不起。我把它倒过来了
xkb\u state\u key\u get\u one\u sym
将keycode转换为keycym,而不是相反。此外,我找不到任何函数来实现你想要的方向,不知何故,“问题”对我来说似乎不合理

例如:要输入=,我需要按多个键,那么您希望在这里输入哪个键码

Xlib中用于
XKeysymToKeycode
的代码只是在所有的keysym上迭代,并试图找到一些匹配项(忽略找到该匹配项的级别)。这也可以使用
xkb\u keymap\u key\u get\u syms\u by\u level

KeyCode
XKeysymToKeycode(
    Display *dpy,
    KeySym ks)
{
    register int i, j;

    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
    return (KeyCode) 0;
    for (j = 0; j < dpy->keysyms_per_keycode; j++) {
    for (i = dpy->min_keycode; i <= dpy->max_keycode; i++) {
        if (KeyCodetoKeySym(dpy, (KeyCode) i, j) == ks)
        return i;
    }
    }
    return 0;
}
KeyCode
XKEYSYMCODE(
显示*dpy,
键符号(ks)
{
寄存器int i,j;
如果((!dpy->keysyms)和(!\uxkeypinitialize(dpy)))
返回(键码)0;
对于(j=0;jkeysyms\u per\u keycode;j++){
对于(i=dpy->min\u keycode;i max\u keycode;i++){
if(keycodetokesym(dpy,(KeyCode)i,j)=ks)
返回i;
}
}
返回0;
}

相关邮件列表线程:(从2010年起)和(从2008年起)。前者确实给出了答案,但后者说没有对应函数的等价物,current也将
XStringToKeysym
标记为TODO。因此,我想单靠XCB并不能很好地实现您的目标。我如何复制XStringToKeysym,这是最困难的部分?我不确定,但从
XKeySymtokeCode
的代码中,如果找到匹配项,我希望您需要循环查看所有键码和级别,并通过
xkb\u keymap\u key\u get\u syms\u by\u level
进行检查。