Question

Existe-t-il une bonne bibliothèque à utiliser pour collecter les entrées utilisateur sous Linux à partir de la souris/clavier/joystick qui ne vous oblige pas à créer une fenêtre visible pour le faire ?SDL vous permet d'obtenir les entrées de l'utilisateur de manière raisonnable, mais semble vous obliger à créer une fenêtre, ce qui est gênant si vous avez abstrait le contrôle, de sorte que la machine de contrôle n'a pas besoin d'être la même que la machine de rendu.Cependant, si les machines de contrôle et de rendu sont les mêmes, cela se traduit par une vilaine petite fenêtre SDL au-dessus de votre écran.

Modifier pour clarifier:
Le moteur de rendu a une fenêtre de sortie, dans son cas d'utilisation normal, cette fenêtre est en plein écran, sauf lorsqu'ils fonctionnent tous les deux sur le même ordinateur, juste pour qu'il soit possible de donner le focus au contrôleur.Il peut en fait y avoir plusieurs moteurs de rendu affichant une vue différente des mêmes données sur différents ordinateurs, tous contrôlés par le même contrôleur, d'où le découplage total de l'entrée de la sortie (ce qui permet de tirer parti du client/serveur X11 intégré pour afficher moins utilisable) En outre, plusieurs applications de contrôleur pour un seul moteur de rendu sont également possibles.La communication entre les contrôleurs et les moteurs de rendu se fait via des sockets.

Était-ce utile?

La solution

OK, si vous êtes sous X11 et que vous souhaitez récupérer le kbd, vous devez faire un grab.Si ce n'est pas le cas, ma seule bonne réponse est ncurses depuis un terminal.

Voici comment récupérer tout ce qui se trouve sur le clavier et le relâcher :

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

Exécutez-le depuis un terminal et tous les événements kbd devraient y parvenir.Je le teste sous Xorg mais il utilise des mécanismes XLIB vénérables et stables.

J'espère que cela t'aides.

ATTENTION aux grabs sous X.Lorsque vous êtes nouveau pour eux, il est parfois une bonne idée de démarrer un processus de retard qui désactivera le serveur lorsque vous testez le code et que vous le laissez s'asseoir et l'exécuter et le grab toutes les deux minutes.Cela évite d'avoir à tuer ou à quitter le serveur pour réinitialiser l'état en externe.

À partir de là, je vous laisse décider comment multiplexer les rendus.Lisez les documents Xgrabkeyboard et les documents XEvent pour commencer.Si vous avez de petites fenêtres exposées aux coins de l'écran, vous pouvez brouiller le pointeur dans un coin pour sélectionner un contrôleur.XwarppoINTER peut également pousser le pointeur vers l'un d'eux à partir du code.

Encore un point :vous pouvez également récupérer le pointeur ainsi que d’autres ressources.Si vous aviez un contrôleur exécuté sur la boîte devant laquelle vous êtes assis, vous pouvez utiliser le clavier et la souris pour le basculer entre des sockets ouverts avec différents moteurs de rendu.Vous ne devriez plus jamais avoir besoin de redimensionner la fenêtre de sortie en dessous du plein écran avec cette approche.Avec plus de travail, vous pourriez en fait déposer des superpositions alpha-mélangées sur le dessus en utilisant les extensions SHAPE et COMPOSITE pour obtenir une fonctionnalité de superposition intéressante en réponse aux entrées de l'utilisateur (ce qui pourrait compter comme dorer le lys).

Autres conseils

Pour la souris, vous pouvez utiliser GPM.

Je ne suis pas sûr du clavier ou du joystick.

Ce ne serait probablement pas trop mal de lire directement ici /dev fichiers si besoin est.

J'espère que cela aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top