Frage

Gibt es eine gute Bibliothek für das sammeln von Benutzereingaben in Linux aus die Maus/Tastatur/joystick, die nicht Kraft Sie zu schaffen eine sichtbare Fenster, dies zu tun?SDL können Sie Benutzereingaben in einer angemessenen Weise aber scheint Sie zu zwingen, ein Fenster erstellen, das ist lästig, wenn Sie haben, abstrahiert Kontrolle, so dass die Kontrolle der Maschine nicht die gleiche wie die render-Maschine.Wenn jedoch der Kontrolle und der render-Maschinen sind die gleichen, diese Ergebnisse in ein hässliches kleines SDL-Fenster auf dem Bildschirm angezeigt werden.

Edit Zu Klären:
Der renderer hat eine Ausgabe-Fenster in seiner normalen Gebrauch Fall, dass das Fenster im Vollbildmodus ist, es sei denn, Sie sind beide auf demselben computer ausgeführt werden, nur so ist es möglich, die Steuerung zu konzentrieren.Es kann tatsächlich mehrere Renderer anzeigen einer anderen Ansicht der gleichen Daten auf verschiedenen Computern gesteuert durch die gleiche controller, damit die vollständige Entkopplung der Eingabe von der Ausgabe (Was unter Ausnutzung der eingebauten X11 client - /server-Zeug für die Anzeige weniger nutzbar) Auch mehrere controller-Anwendungen für einen renderer ist auch möglich.Die Kommunikation zwischen dem Controller und Renderer ist über sockets.

War es hilfreich?

Lösung

OK, wenn Sie unter X11 und Sie möchten Holen Sie sich die kbd, müssen Sie ein grab.Wenn Sie nicht, meine einzige gute Antwort ist ncurses aus einem terminal.

Hier ist, wie Sie schnappen Sie sich alles von der Tastatur aus-und wieder loslassen:

/* Demo code, needs more error checking, compile
 * with "gcc nameofthisfile.c -lX11".

/* weird formatting for markdown follows.  argh! */

#include <X11/Xlib.h>

int main(int argc, char **argv)
{
   Display *dpy;
   XEvent ev;
   char *s;
   unsigned int kc;
   int quit = 0;

   if (NULL==(dpy=XOpenDisplay(NULL))) {
      perror(argv[0]);
      exit(1);
   }

   /*
    * You might want to warp the pointer to somewhere that you know
    * is not associated with anything that will drain events.
    *  (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
    */

   XGrabKeyboard(dpy, DefaultRootWindow(dpy),
                 True, GrabModeAsync, GrabModeAsync, CurrentTime);

   printf("KEYBOARD GRABBED!  Hit 'q' to quit!\n"
          "If this job is killed or you get stuck, use Ctrl-Alt-F1\n"
          "to switch to a console (if possible) and run something that\n"
          "ungrabs the keyboard.\n");


   /* A very simple event loop: start at "man XEvent" for more info. */
   /* Also see "apropos XGrab" for various ways to lock down access to
    * certain types of info. coming out of or going into the server */
   for (;!quit;) {
      XNextEvent(dpy, &ev);
      switch (ev.type) {
         case KeyPress:
            kc = ((XKeyPressedEvent*)&ev)->keycode;
            s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
            /* s is NULL or a static no-touchy return string. */
            if (s) printf("KEY:%s\n", s);
            if (!strcmp(s, "q")) quit=~0;
            break;
         case Expose:
               /* Often, it's a good idea to drain residual exposes to
                * avoid visiting Blinky's Fun Club. */
               while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
            break;
         case ButtonPress:
         case ButtonRelease:
         case KeyRelease:
         case MotionNotify:
         case ConfigureNotify:
         default:
            break;
      }
   }

   XUngrabKeyboard(dpy, CurrentTime);

   if (XCloseDisplay(dpy)) {
      perror(argv[0]);
      exit(1);
   }

   return 0;
}

Führen Sie dies von einem terminal aus und alle kbd Veranstaltungen sollte es treffen.Ich Teste es unter Xorg aber es nutzt ehrwürdigen, stabile Xlib-Mechanismen.

Hoffe, das hilft.

SEIEN Sie VORSICHTIG mit Griffen unter X.Wenn Sie sind neue zu Ihnen, manchmal ist es eine gute Idee zu Beginn der Zeit Verzögerung Prozess, der ungrab dem server, wenn Sie sind testen von code und lassen Sie es sitzen und laufen und ungrab alle paar Minuten.Es spart zu töten oder Schalter Weg von der server an eine extern reset-Zustand.

Von hier aus werde ich überlasse es Ihnen zu entscheiden, wie multiplex-renderes.Lesen die XGrabKeyboard docs und XEvent docs, um loszulegen.Wenn Sie haben kleine Fenster ausgesetzt auf dem Bildschirm Ecken, man könnte jam den Zeiger in eine Ecke, um wählen Sie einen controller.XWarpPointer können schieben Sie den Zeiger, um eine von Ihnen als auch von code.

Ein weiterer Punkt:fassen Sie die Zeiger, als auch, und andere Ressourcen.Wenn Sie einen controller laufen auf das Feld, vor dem Sie sitzen, könnten Sie die Tastatur-und Maus-Eingaben wechseln Sie zwischen geöffneten sockets mit verschiedenen Renderern.Sollten Sie nicht brauchen, um die Größe der Ausgabe-Fenster auf weniger als Vollbild mehr mit diesem Ansatz immer.Mit mehr Arbeit, man könnte tatsächlich drop-alpha-blended-overlays auf der Oberseite mit der FORM-und COMPOSITE-Erweiterungen zu Holen ein schönes overlay-Funktion in Reaktion auf Benutzereingaben (die Zählung als Vergoldung der Lilie).

Andere Tipps

Für die Maus, die Sie verwenden können GPM.

Ich bin mir nicht sicher aus der Spitze von meinem Kopf, für die Tastatur oder den joystick.

Es wäre wahrscheinlich nicht zu schlecht zum Lesen direkt von dort /dev Dateien, wenn nötig.

Hoffe es hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top