2008-09-08 10 views
7

Y at-il une bonne bibliothèque à utiliser pour recueillir les commentaires des utilisateurs dans Linux de la souris/clavier/joystick qui ne vous oblige pas à créer une fenêtre visible pour le faire? SDL vous permet d'obtenir une entrée utilisateur de manière raisonnable, mais semble vous forcer à créer une fenêtre, ce qui est gênant si vous avez fait abstraction du contrôle pour que la machine de contrôle ne soit pas identique à la machine de rendu. Cependant, si les machines de contrôle et de rendu sont les mêmes, cela se traduit par une petite fenêtre SDL sur le dessus de votre écran.bibliothèque d'entrée Linux/X11 sans créer une fenêtre

Modifier Pour clarifier:
Le moteur de rendu a une fenêtre de sortie, dans son cas d'utilisation normale, cette fenêtre est plein écran, sauf quand ils sont tous deux en cours d'exécution sur le même ordinateur, il est possible de donner focus du contrôleur. Il peut effectivement y avoir plusieurs rendus 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 (tirer parti de l'étoffe client/serveur X11 intégrée pour afficher moins utilisable) En outre, plusieurs applications de contrôleur pour un moteur de rendu est également possible. La communication entre les contrôleurs et les moteurs de rendu se fait via des sockets.

+0

J'ai supprimé la "réponse" qui a conduit à la clarification ci-dessus ... Je pense que la clarification doit rester, mais elle couvre assez que ma pseudo-réponse, qui aurait pu être un commentaire, peut être entièrement effacée. –

Répondre

7

OK, si vous êtes sous X11 et que vous voulez obtenir le kbd, vous devez faire un grappin. Si ce n'est pas le cas, ma seule bonne réponse est ncurses d'un terminal.

Voilà comment vous prenez tout à partir du clavier et relâchez à nouveau:

 
/* 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écuter ce à partir d'un terminal et tous les événements kbd devraient frapper. Je le teste sous Xorg mais il utilise des mécanismes Xlib vénérables et stables.

Espérons que cela aide.

SOYEZ PRUDENT avec grappins sous X. Lorsque vous êtes nouveau pour eux, il est parfois une bonne idée de commencer un processus de temporisation qui ungrab le serveur lorsque vous êtes code de test et laissez reposer et courir et décrocher toutes les quelques minutes. Il évite d'avoir à tuer ou de quitter le serveur pour réinitialiser l'état externe.

A partir de là, je vais laisser à vous de décider comment multiplexer renderes. 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 coincer le pointeur dans un coin pour sélectionner un contrôleur. XWarpPointer peut mettre le pointeur sur l'un d'entre eux ainsi que du code.

Un point de plus: vous pouvez saisir le pointeur ainsi, et d'autres ressources. Si vous avez un contrôleur en cours d'exécution sur la boîte en face de laquelle vous êtes assis, vous pouvez utiliser le clavier et la souris pour le basculer entre des sockets ouverts avec des moteurs de rendu différents.Vous ne devriez pas avoir besoin de redimensionner la fenêtre de sortie à moins de plein écran avec cette approche, jamais. Avec plus de travail, vous pouvez réellement déposer des superpositions alpha-mélangées sur le dessus en utilisant les extensions SHAPE et COMPOSITE pour obtenir une belle fonctionnalité de superposition en réponse à l'entrée de l'utilisateur (qui pourrait compter comme dorure le lis).

+0

Cette réponse + la réponse de GPM par Brian répond à ma question, mais je ne peux sélectionner qu'une seule réponse. – rck

+0

Notez que GPM n'interagira probablement pas confortablement avec X actif sur le même terminal ... lisez attentivement la fin de la page de manuel "BUGS". Même si cela semble faisable, j'irais au serveur X pour les deux types d'événements. –

2

Pour la souris, vous pouvez utiliser GPM.

Je ne suis pas sûr du haut de ma tête pour le clavier ou joystick.

Il ne serait probablement pas trop mal pour lire directement sur il /dev fichiers si nécessaire.

Hope it helps

Questions connexes