7

私はASCII文字の形で入力を受け取る小さなプログラムを持っています。x11関数で使用するためにこれらをキーコードに変換できる必要があります。これまたは別のライブラリを実行するためのxlib関数はありますか?それとも、大きなスイッチケースが最適ですか?

4

2 に答える 2

14

この質問には、(@ 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 :-)
}

KeyCodesたとえばASCII1(Control-A)は(または)修飾子XK_Aを使用するため、'else'句には複数が必要になります。したがって、たとえば、DOWN、DOWN、UP、UPを発行する必要があります。XK_CONTROL_RXK_CONTROL_LXK_CONTROL_LXK_AXK_AXK_CONTROL_L

これは、シミュレートされたキーボードイベントを介して最初の引数をエコーすることによってこれを示すおもちゃのプログラムです。

#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に害はありませんでした。

于 2014-09-10T17:54:15.207 に答える
1

を使用XStringToKeysymして、少なくとも英数字をsに変換しKeySym、続いてsに変換することができます。XKeysymToKeycodeKeyCode

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

@BobDoolitleが彼の回答で指摘したように、XStringToKeysym英数字の1文字の文字列では機能しますが、ASCIIの一般的なケースでは失敗します。0x20彼は、ASCII文字( – )の大部分を簡単に処理する方法を提供していますが、0x7Fその範囲外の文字はより慎重に扱う必要があります。

于 2012-09-10T01:00:25.127 に答える