私はASCII文字の形で入力を受け取る小さなプログラムを持っています。x11関数で使用するためにこれらをキーコードに変換できる必要があります。これまたは別のライブラリを実行するためのxlib関数はありますか?それとも、大きなスイッチケースが最適ですか?
2 に答える
この質問には、(@ 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 :-)
}
KeyCodes
たとえばASCII
1(Control-A)は(または)修飾子XK_A
を使用するため、'else'句には複数が必要になります。したがって、たとえば、DOWN、DOWN、UP、UPを発行する必要があります。XK_CONTROL_R
XK_CONTROL_L
XK_CONTROL_L
XK_A
XK_A
XK_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に害はありませんでした。
を使用XStringToKeysym
して、少なくとも英数字をsに変換しKeySym
、続いてsに変換することができます。XKeysymToKeycode
KeyCode
Display *display = ...;
KeySym sym_a = XStringToKeysym("A");
KeyCode code_a = XKeysymToKeycode(display, sym_a);
@BobDoolitleが彼の回答で指摘したように、XStringToKeysym
英数字の1文字の文字列では機能しますが、ASCIIの一般的なケースでは失敗します。0x20
彼は、ASCII文字( – )の大部分を簡単に処理する方法を提供していますが、0x7F
その範囲外の文字はより慎重に扱う必要があります。