2008-09-08 24 views
7

Gibt es eine gute Bibliothek zum Sammeln von Benutzereingaben in Linux über die Maus/Tastatur/Joystick, die Sie nicht zwingt, ein sichtbares Fenster dafür zu erstellen? SDL können Sie Benutzereingaben in einer angemessenen Art und Weise, aber scheint, Sie zu zwingen, um ein Fenster zu schaffen, was mühsam ist, wenn Sie die Kontrolle entzogen haben, so dass die Steuer Maschine die gleiche wie die Rendermaschine nicht muss sein. Wenn jedoch die Steuerungs- und Render-Maschinen identisch sind, führt dies zu einem hässlichen kleinen SDL-Fenster oben auf Ihrem Bildschirm.Linux/X11 Eingabebibliothek ohne Erstellen eines Fensters

bearbeiten zu klären:
Der Renderer hat ein Ausgabefenster, in seiner normalen Anwendungsfall, dass Fenster Vollbild, es sei denn, sie sind beide auf demselben Computer ausgeführt werden, nur so ist es möglich, das geben, Steuerungsfokus. Es tatsächlich mehrere Renderer Anzeigen eine andere Sicht auf die gleichen Daten auf verschiedenen Computern alle gesteuert durch die gleiche Steuerung sein kann, damit die vollständige Entkopplung der Eingang vom Ausgang (um die volle integrierten X11 unter Client/Server-Material für die Anzeige weniger nutzbar) Auch mehrere Controller-Anwendungen für einen Renderer sind möglich. Die Kommunikation zwischen den Controllern und den Renderern erfolgt über Sockets.

+0

Ich löschte die "Antwort", die zu der obigen Klarstellung führte ... Ich denke, die Klärung muss bleiben, aber es deckt genug, dass meine Pseudo-Antwort, die ein Kommentar hätte sein können, vollständig gelöscht werden kann. –

Antwort

7

OK hilft, wenn Sie unter X11 sind und Sie die kbd bekommen, benötigen Sie einen Greifer zu tun. Wenn Sie nicht sind, ist meine einzige gute Antwort ncurses von einem Terminal.

Hier ist, wie Sie alles, was von der Tastatur greifen 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 dieses von einem Terminal und alle kbd Ereignisse es treffen sollte. Ich teste es unter Xorg , aber es verwendet ehrwürdige, stabile Xlib-Mechanismen.

Hoffe, das hilft.

ACHTUNG mit Greifern unter X. Wenn Sie die neu für sie sind, manchmal ist es eine gute Idee eine Zeitverzögerung zu starten, die den Server wird Ungrab wenn Sie Testcode sind und lassen Sie es sich und laufen und Ungrab alle paar Minuten. Es erspart das Töten oder Wechseln vom Server in den externen Reset-Zustand.

Von hier aus überlasse ich es Ihnen zu entscheiden, wie Renderer zu multiplexen. Lesen Sie die XGrabKeyboard-Dokumente und XEvent-Dokumente, um zu beginnen. Wenn Sie an den Bildschirmecken ausgesetzt kleine Fenster haben, könnten Sie der Zeiger in eine Ecke stauen einen Controller auszuwählen. XWarpPointer kann den Zeiger zu einem von ihnen auch vom Code schieben.

Ein weiterer Punkt: Sie können auch den Zeiger und andere Ressourcen greifen. Wenn auf der Box, vor der Sie sitzen, ein Controller ausgeführt wird, können Sie die Tastatur und die Maus verwenden, um zwischen offenen Sockets mit verschiedenen Renderern zu wechseln.Sie sollten das Ausgabefenster mit diesem Ansatz nicht mehr auf weniger als Vollbildgröße ändern müssen. Mit mehr Arbeit können Sie Alpha-Blended-Overlays mit den SHAPE- und COMPOSITE-Erweiterungen ganz oben ablegen, um eine nette Überlagerungsfunktion als Reaktion auf Benutzereingaben zu erhalten (die als Vergoldung der Lilie gelten könnten).

+0

Diese Antwort + die GPM Antwort von Brian beantwortet meine Frage, aber ich kann nur 1 Antwort auswählen. – rck

+0

Beachten Sie, dass GPM wahrscheinlich nicht bequem mit X aktiv auf dem gleichen Terminal interagieren wird ... lesen Sie das Ende der man-Seite "Bugs" Abschnitt sorgfältig. Selbst wenn es praktikabel aussieht, würde ich für beide Arten von Ereignissen auf den X-Server gehen. –

2

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

Ich bin nicht sicher von der Spitze meines Kopfes für Tastatur oder Joystick.

Es wäre wahrscheinlich nicht schlecht zu lesen direkt /dev Dateien, wenn nötig.

Hoffe, dass es

Verwandte Themen