X11 を使用していて kbd を取得したい場合は、グラブを行う必要があります。そうでない場合、私の唯一の良い答えは端末からの ncurses です。
キーボードからすべてをつかみ、もう一度離す方法は次のとおりです。
/* デモ コード、さらにエラー チェックが必要、コンパイル
* "gcc nameofthisfile.c -lX11" を使用。
/* マークダウンの奇妙なフォーマットが続きます。ああ!*/
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
表示 *dpy;
XEvent ev;
char *s;
unsigned int kc;
int 終了 = 0;
if (NULL==(dpy=XOpenDisplay(NULL))) {
perror(argv[0]);
終了 (1);
}
/*
* ポインターを知っている場所にワープさせたい場合があります
* イベントを排出するものとは関連付けられていません。
* (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
*/
XGrabKeyboard(dpy, DefaultRootWindow(dpy),
True、GrabModeAsync、GrabModeAsync、CurrentTime);
printf("キーボードをつかみました!終了するには 'q' を押してください!\n"
"このジョブが強制終了された場合、またはスタックした場合は、Ctrl-Alt-F1 を使用してください\n"
"(可能であれば) コンソールに切り替えて、\n"
"キーボードのグラブを解除します。\n");
/* 非常に単純なイベント ループ: 詳細については、「man XEvent」から始めてください。*/
/* アクセスをロックダウンするさまざまな方法については、「apropos XGrab」も参照してください。
* 特定の種類の情報。サーバーからの出入り */
for (;!quit;) {
XNextEvent(dpy, &ev);
スイッチ (ev.type) {
ケースキープレス:
kc = ((XKeyPressedEvent*)&ev)->キーコード;
s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
/* s は NULL または静的なノータッチの戻り文字列です。*/
if (s) printf("KEY:%s\n", s);
if (!strcmp(s, "q")) quit=~0;
壊す;
ケース公開:
/* 多くの場合、残りのエクスポージャーを排出することをお勧めします
* Blinky's Fun Clubへの訪問は避けてください。*/
while (XCheckTypedEvent(dpy, Expose, &ev)) /* 空の本体 */ ;
壊す;
ケース ボタンを押す:
ケースボタンリリース:
ケースキーリリース:
ケース MotionNotify:
ケース構成通知:
デフォルト:
壊す;
}
}
XUngrabKeyboard(dpy, CurrentTime);
if (XCloseDisplay(dpy)) {
perror(argv[0]);
終了 (1);
}
0 を返します。
}
これを端末から実行すると、すべての kbd イベントがヒットするはずです。Xorg でテストしていますが、由緒ある安定した Xlib メカニズムを使用しています。
お役に立てれば。
X でのグラブには注意してください。グラブを初めて使用する場合は、コードをテストしているときにサーバーのグラブを解除する時間遅延プロセスを開始し、数分ごとにサーバーを実行してからグラブを解除することをお勧めします。サーバーを強制終了するか、サーバーから離れて外部リセット状態に切り替える必要がなくなります。
ここからは、レンダリングを多重化する方法を決定するのはあなたに任せます。開始するには、XGrabKeyboard のドキュメントと XEvent のドキュメントをお読みください。画面の隅に小さなウィンドウが表示されている場合は、ポインターを 1 つの隅に押し込んでコントローラーを選択することができます。XWarpPointer は、コードからそれらの 1 つへのポインターを押し込むこともできます。
もう 1 つのポイント: ポインターやその他のリソースも取得できます。目の前に座っているボックスで 1 つのコントローラーが実行されている場合、キーボードとマウスの入力を使用して、異なるレンダラーで開いているソケット間でコントローラーを切り替えることができます。このアプローチでは、出力ウィンドウのサイズをフルスクリーン未満に変更する必要はもうありません。さらに作業を進めれば、SHAPE 拡張機能と COMPOSITE 拡張機能を使用して実際にアルファ ブレンドされたオーバーレイを上にドロップし、ユーザー入力に応答して適切なオーバーレイ機能を取得できます (これはユリに金メッキを施すことと見なされる可能性があります)。