Pregunta

¿Existe una buena biblioteca que pueda usarse para recopilar la entrada del usuario en Linux desde el mouse/teclado/joystick que no lo obligue a crear una ventana visible para hacerlo?SDL le permite obtener información del usuario de una manera razonable, pero parece obligarlo a crear una ventana, lo cual es problemático si ha abstraído el control, por lo que la máquina de control no tiene que ser la misma que la máquina de renderizado.Sin embargo, si las máquinas de control y renderizado son las mismas, esto resulta en una pequeña y fea ventana SDL en la parte superior de la pantalla.

Editar para aclarar:
El renderizador tiene una ventana de salida, en su caso de uso normal, esa ventana es de pantalla completa, excepto cuando ambos se están ejecutando en la misma computadora, solo para que sea posible darle foco al controlador.En realidad, puede haber varios renderizadores que muestren una vista diferente de los mismos datos en diferentes computadoras, todas controladas por el mismo controlador, de ahí el desacoplamiento total de la entrada de la salida (haciendo que se aproveche el cliente/servidor X11 integrado para mostrar menos utilizable) Además, también son posibles múltiples aplicaciones de controlador para un renderizador.La comunicación entre los controladores y los renderizadores se realiza a través de sockets.

¿Fue útil?

Solución

Bien, si estás bajo X11 y quieres obtener el kbd, debes realizar una captura.Si no es así, mi única buena respuesta son ncurses desde una terminal.

Así es como tomas todo del teclado y lo sueltas nuevamente:

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

Ejecute esto desde una terminal y todos los eventos de kbd deberían aparecer.Lo estoy probando bajo Xorg, pero utiliza mecanismos venerables y estables XLIB.

Espero que esto ayude.

TENGA CUIDADO con los agarres debajo de X.Cuando eres nuevo en ellos, a veces es una buena idea iniciar un proceso de retraso de tiempo que desgastará el servidor cuando esté probando el código y lo deje reposar y ejecutar y desgastar cada dos minutos.Ahorra tener que cerrar o cambiar del servidor para restablecer el estado externamente.

A partir de aquí, dejaré que usted decida cómo multiplexar los renderizados.Lea los documentos XGRABKEYBOARD y los documentos de Xevent para comenzar.Si tiene pequeñas ventanas expuestas en las esquinas de la pantalla, puede atascar el puntero en una esquina para seleccionar un controlador.Xwarpointer puede llevar el puntero a uno de ellos también del código.

Un punto más:También puede tomar el puntero y otros recursos.Si tuviera un controlador ejecutándose en la caja frente a la cual está sentado, podría usar la entrada del teclado y el mouse para cambiar entre sockets abiertos con diferentes renderizadores.Con este enfoque ya no debería necesitar cambiar el tamaño de la ventana de salida a menos de pantalla completa.Con más trabajo, podrías colocar superposiciones combinadas alfa encima usando las extensiones SHAPE y COMPOSITE para obtener una buena función de superposición en respuesta a la entrada del usuario (lo que podría contar como dorar el lirio).

Otros consejos

Para el mouse puedes usar GPM.

No estoy seguro de cuál es el teclado o el joystick.

Probablemente no sería tan malo leer directamente allí. /dev archivos si es necesario.

Espero eso ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top