Domanda

Esiste una buona libreria da utilizzare per raccogliere l'input dell'utente in Linux dal mouse/tastiera/joystick che non ti obblighi a creare una finestra visibile per farlo?SDL ti consente di ottenere l'input dell'utente in modo ragionevole, ma sembra costringerti a creare una finestra, il che è problematico se hai un controllo astratto in modo che la macchina di controllo non debba essere la stessa della macchina di rendering.Tuttavia, se le macchine di controllo e di rendering sono le stesse, ciò si traduce in una brutta piccola finestra SDL nella parte superiore dello schermo.

Modifica per chiarire:
Il renderer ha una finestra di output, nel suo caso d'uso normale, quella finestra è a schermo intero, tranne quando sono entrambi in esecuzione sullo stesso computer, solo così è possibile dare il focus al controller.In realtà possono esserci più renderer che visualizzano una vista diversa degli stessi dati su computer diversi, tutti controllati dallo stesso controller, da qui il disaccoppiamento totale dell'input dall'output (sfruttando il materiale client/server X11 integrato per visualizzare meno utilizzabile) Inoltre, sono possibili anche più applicazioni controller per un renderer.La comunicazione tra i controller e i renderer avviene tramite socket.

È stato utile?

Soluzione

OK, se sei sotto X11 e vuoi ottenere il kbd, devi fare un grab.In caso contrario, la mia unica buona risposta è ncurses da un terminale.

Ecco come prendi tutto dalla tastiera e rilasci 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;
}

Eseguilo da un terminale e tutti gli eventi kbd dovrebbero colpirlo.Lo sto testando sotto Xorg ma utilizza meccanismi XLIB venerabili e stabili.

Spero che questo ti aiuti.

FARE ATTENZIONE alle prese sotto X.Quando sei nuovo per loro, a volte è una buona idea avviare un processo di ritardo che sbarcherà il server quando si testa il codice e lo lasci sedere e eseguire e non gradire ogni paio di minuti.Si evita di dover interrompere o passare dal server allo stato di ripristino esterno.

Da qui, lascerò a te la decisione su come eseguire il rendering multiplex.Leggi i documenti XGRABKEYBoy e i documenti Xevent per iniziare.Se hai piccole finestre esposte agli angoli dello schermo, è possibile inchiare il puntatore in un angolo per selezionare un controller.Xwarppointer può spingere il puntatore a uno di essi anche dal codice.

Un altro punto:puoi anche prendere il puntatore e altre risorse.Se avessi un controller in esecuzione sulla scatola di fronte alla quale ti siedi, potresti utilizzare l'input della tastiera e del mouse per commutarlo tra socket aperti con renderer diversi.Con questo approccio non dovresti più aver bisogno di ridimensionare la finestra di output a meno dello schermo intero.Con più lavoro, potresti effettivamente rilasciare sovrapposizioni con fusione alfa in alto utilizzando le estensioni SHAPE e COMPOSITE per ottenere una bella funzionalità di sovrapposizione in risposta all'input dell'utente (che potrebbe contare come dorare il giglio).

Altri suggerimenti

Per il mouse che puoi usare GPM.

Non sono sicuro che ci sia tastiera o joystick.

Probabilmente non sarebbe poi così male leggere direttamente da lì /dev file se necessario.

Spero che sia d'aiuto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top