将ASCII字符转换为x11键码

a s*_*ich 6 c ascii xll

我有一个小程序,以ascii字符的形式输入.我需要能够将这些转换为密钥代码以用于x11函数.是否有xlib函数来执行此操作或其他库?或者大型开关盒最好用吗?

Bob*_*tle 9

这个问题有一个古老而错误的答案(来自@oldrinb),奇怪的是从来没有受过挑战.如评论中所述,您不能使用XStringToKeysym以一般方式将字符映射到KeySyms.它适用于字母和数字,但这就是它,因为KeySym名称恰好直接映射到那些ASCII字符.对于其他ASCII字符,如标点符号或空格,它将无法工作.

但你可以做得更好.如果你看看<X11/keysymdef.h>你发现ASCII0x20-0xFF,字符直接映射到XKeySyms.所以,我会说直接使用这个字符范围更简单,只是KeySyms将剩下的32个字符映射到它们对应的字符KeyCodes.所以我会说代码应该更合适:

Display *display = ...;
if ((int)c >= 0x20) {
    XKeysymToKeycode(display, (KeySym)c);
} else {
    ... // Exercise left to the reader :-)
}
Run Code Online (Sandbox Code Playgroud)

'else'子句将需要多个,KeyCodes因为例如ASCII1(Control-A)XK_AXK_CONTROL_R(或XK_CONTROL_L)修饰符一起使用.所以你必须发出例如:XK_CONTROL_LDOWN,XK_ADOWN,XK_AUP,XK_CONTROL_LUP.

这是一个玩具程序,通过模拟键盘事件回显第一个参数来演示这个:

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xlib-xcb.h>
#include <xcb/xcb.h>
#include <xcb/xcb_event.h>
#include <xcb/xtest.h>

main(int argc, char **argv)
{
    char *pc;
    xcb_connection_t *xconn;
    KeyCode code_a;
    Display *dpy = XOpenDisplay(NULL);

    xconn = XGetXCBConnection(dpy);

    for (pc = argv[1]; *pc != '\0'; ++pc) {
        if (*pc >= (char)0x20) {
            code_a = XKeysymToKeycode(dpy, (KeySym)*pc);
            xcb_test_fake_input(xconn, XCB_KEY_PRESS, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);
            xcb_test_fake_input(xconn, XCB_KEY_RELEASE, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);
            xcb_flush(xconn);
        } else {
            fprintf(stderr, "Eeek - out-of-range character 0x%x\n", (unsigned int)*pc);
        }
    }
    XCloseDisplay(dpy);
}
Run Code Online (Sandbox Code Playgroud)

您需要将其链接到: -lX11 -lxcb -lxcb-xtest -lX11-xcb

免责声明:在编写此代码时,没有任何KeySyms受到损害.


old*_*inb 1

您可以使用XStringToKeysym将至少字母数字字符转换为KeySyms,然后使用XKeysymToKeycodefor 转换为KeyCodes:

Display *display = ...;
KeySym sym_a = XStringToKeysym("A");
KeyCode code_a = XKeysymToKeycode(display, sym_a);
Run Code Online (Sandbox Code Playgroud)

正如 @BobDoolitle 在他的回答中指出的那样,虽然XStringToKeysym适用于字母数字单字符字符串,但在 ASCII 一般情况下会失败。他提供了一种轻松处理大多数 ASCII 字符 ( 0x20- 0x7F) 的方法,尽管超出该范围的字符需要更仔细的处理。

  • 这在一般情况下不起作用。XStringToKeysym 映射 KeySym 名称,而不是 ASCII 字符。您通常会没事,因为对于常见的打印字符,KeySym 名称与字符匹配,但它不适用于空格字符等。 (2认同)