7

マウス/キーボード/ジョイスティックからLinuxでユーザー入力を収集するために使用する、可視ウィンドウを作成する必要のない適切なライブラリはありますか? SDL では合理的な方法でユーザー入力を取得できますが、ウィンドウを作成する必要があるように思われます。これは、コントロールを抽象化して、コントロール マシンがレンダリング マシンと同じである必要がない場合に面倒です。ただし、コントロール マシンとレンダリング マシンが同じである場合、ディスプレイの上に見苦しい小さな SDL ウィンドウが表示されます。

明確にするために編集:
レンダラーには出力ウィンドウがあり、通常の使用例では、両方が同じコンピューター上で実行されている場合を除いて、そのウィンドウはフルスクリーンです。これにより、コントローラーにフォーカスを与えることができます。実際には複数のレンダラーが存在し、すべてが同じコントローラーによって制御される異なるコンピューター上で同じデータの異なるビューを表示する可能性があるため、入力と出力が完全に分離されます (組み込みの X11 クライアント/サーバー機能を利用して表示を少なくします)。使用可能) また、1 つのレンダラーに対して複数のコントローラー アプリケーションも可能です。コントローラーとレンダラー間の通信は、ソケットを介して行われます。

4

2 に答える 2

7

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 拡張機能を使用して実際にアルファ ブレンドされたオーバーレイを上にドロップし、ユーザー入力に応答して適切なオーバーレイ機能を取得できます (これはユリに金メッキを施すことと見なされる可能性があります)。

于 2008-09-09T16:14:01.033 に答える
2

マウスにはGPMを使用できます。

キーボードやジョイスティックについて頭の中でよくわかりません。

/dev必要に応じてそこにあるファイルから直接読み取ることは、おそらくそれほど悪くないでしょう。

それが役に立てば幸い

于 2008-09-08T17:24:06.473 に答える