2008-09-08 21 views
7

Esiste una buona libreria da utilizzare per la raccolta di input utente in Linux dal mouse/tastiera/joystick che non ti obbliga a creare una finestra visibile per farlo? SDL ti consente di ottenere input dell'utente in modo ragionevole, ma sembra forzarti a creare una finestra, il che è problematico se hai un controllo astratto in modo che la macchina di controllo non debba essere uguale alla macchina di rendering. Tuttavia, se le macchine di controllo e di rendering sono uguali, questo si traduce in una brutta finestra SDL sulla parte superiore del display.Libreria di input Linux/X11 senza creare una finestra

Modifica Per chiarire:
Il renderer ha una finestra di uscita, nel suo normale caso d'uso, quella finestra è a schermo intero, tranne quando sono entrambi in esecuzione sullo stesso computer, solo così è possibile dare il messa a fuoco del controller. Possono esserci in realtà più riproduttori che mostrano una diversa visualizzazione degli stessi dati su computer diversi, tutti controllati dallo stesso controller, quindi il disaccoppiamento totale dell'ingresso dall'output (sfruttando il client/server X11 integrato per visualizzare meno utilizzabile) Inoltre, sono possibili anche più applicazioni di controller per un unico renderer. La comunicazione tra i controller e i renderer avviene tramite prese.

+0

Ho eliminato la "risposta" che ha portato al chiarimento sopra ... Penso che il chiarimento debba rimanere, ma copre abbastanza che la mia pseudo-risposta, che avrebbe potuto essere un commento, può essere completamente cancellata. –

risposta

7

OK, se sei sotto X11 e si desidera ottenere il kbd, è necessario fare una gru a benna. Se non lo sei, la mia unica buona risposta è ncurses da un terminale.

Ecco come si afferra tutto dalla tastiera e rilasciare di nuovo:

 
/* 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; 
} 

eseguire questo da un terminale e tutti gli eventi KBD dovrebbero colpire. Lo sto testando con Xorg ma utilizza venerabili meccanismi Xlib stabili.

Spero che questo aiuti.

stare attenti con le gru a benna sotto X. Quando sei nuovo per loro, a volte è una buona idea per avviare un processo di ritardo che rilasciare un grab server quando sei codice di test e lasciare riposare e correre e ungrab ogni due minuti. Salva la necessità di uccidere o passare dal server allo stato di ripristino esterno.

Da qui, lascio a voi decidere come eseguire il rendering multiplex. Leggi i documenti XGrabKeyboard e i documenti XEvent per iniziare. Se le piccole finestre sono esposte agli angoli dello schermo, è possibile bloccare il puntatore in un angolo per selezionare un controller. XWarpPointer può spostare il puntatore a uno di essi e dal codice.

Un altro punto: puoi prendere il puntatore e altre risorse. Se si ha un controller in esecuzione sulla scatola davanti alla quale ci si siede, è possibile utilizzare l'input della tastiera e del mouse per commutarlo tra socket aperti con diversi renderer.Non avresti bisogno di ridimensionare la finestra di output a meno di tutto lo schermo con questo approccio, mai. Con più lavoro, è possibile eliminare sovrapposizioni alfa in alto usando le estensioni SHAPE e COMPOSITE per ottenere una bella funzione di sovrapposizione in risposta all'input dell'utente (che potrebbe contare come dorare il giglio).

+0

Questa risposta + la risposta GPM di Brian risponde alla mia domanda, ma posso selezionare solo 1 risposta. – rck

+0

Nota che GPM probabilmente non interagirà comodamente con X attivo sullo stesso terminale ... leggi attentamente la fine della pagina man "BUGS". Anche se sembra fattibile, andrei al server X per entrambi i tipi di evento. –

2

Per il mouse è possibile utilizzare GPM.

Non sono sicuro di avere la parte superiore della mia testa per tastiera o joystick.

Probabilmente non sarebbe male leggere direttamente lì i file /dev se necessario.

Speranza che aiuta

Problemi correlati