将ASCII字符转换为x11键码

时间:2012-09-10 00:01:23

标签: c ascii xll

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

2 个答案:

答案 0 :(得分:8)

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

但你可以做得更好。如果您查看<X11/keysymdef.h> ASCII 0x20-0xFF,则字符会将直接映射到XKeySyms。因此,我说直接使用该范围的字符KeySyms更简单,只需将剩余的32个字符映射到相应的KeyCodes即可。所以我说代码应该更合适:

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

&#39;其他&#39;子句将需要多个KeyCodes,因为例如ASCII 1(Control-A)与XK_A(或XK_CONTROL_R)修饰符为XK_CONTROL_L。因此,您必须发出以下问题:XK_CONTROL_L DOWN,XK_A DOWN,XK_A UP,XK_CONTROL_L UP。

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

#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);
}

您需要将其与-lX11 -lxcb -lxcb-xtest -lX11-xcb

相关联

免责声明:编写此代码时没有损害KeySyms。

答案 1 :(得分:1)

您可以使用XStringToKeysym转换为KeySym,然后使用XKeysymToKeycode转换为KeyCode

Display *display = ...;
KeySym sym_a = XStringToKeysym("A");
KeyCode code_a = XKeysymToKeycode(display, sym_a);