【问题标题】:Get keycode from key name in XCB?从 XCB 中的键名获取键码?
【发布时间】:2019-08-14 03:16:17
【问题描述】:

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

XKeysymToKeycode(display, XStringToKeysym("Tab"))

我设法通过xmodmap -pke 获取密钥代码并将其硬编码到应用程序中,但我很确定这会给我带来问题(不同的硬件?不同的发行版?)。

有什么方法可以从 XCB 中的名称中获取键码?

【问题讨论】:

标签: linux x11 xcb


【解决方案1】:

我确定您要查找的库是 libxkbcommon:https://xkbcommon.org/

相信你正在寻找的功能可能是xkb_state_key_get_one_sym:https://xkbcommon.org/doc/current/group__state.html#ga47311e7268935dd2fe3e6ef057a82cb0 此函数获取键盘状态和键码并提供键符。

编辑:哎呀,对不起。我把它弄反了。 xkb_state_key_get_one_sym 将键码转换为键符,而不是相反。另外,我找不到任何功能来做你想要的方向,不知何故,“问题”对我来说似乎不明智。

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

Xlib 中XKeysymToKeycode 的代码只是遍历所有键符并尝试找到一些匹配项(忽略它找到此匹配项的级别)。这也可以通过xkb_keymap_key_get_syms_by_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;
}

【讨论】:

  • 如何复制 XStringToKeysym,这是最困难的部分?
  • 我不确定,但从XKeysymToKeycode 的代码来看,我希望您需要遍历所有键码和级别,并通过xkb_keymap_key_get_syms_by_level 检查是否找到匹配项。跨度>
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2013-10-22
  • 2015-10-01
相关资源
最近更新 更多