2008-09-08 10 views
7

¿Hay una buena biblioteca para recopilar datos del usuario en Linux desde el mouse/teclado/joystick que no lo obliga a crear una ventana visible para hacerlo? SDL le permite obtener la entrada del usuario de una manera razonable, pero parece forzarlo a crear una ventana, lo cual es problemático si ha abstraído el control para que la máquina de control no tenga que ser la misma que la máquina de renderizado. Sin embargo, si las máquinas de control y renderización son iguales, esto da como resultado una fea ventana SDL pequeña en la parte superior de la pantalla.Biblioteca de entrada Linux/X11 sin crear una ventana

Editar para aclarar:
El procesador tiene una ventana de salida, en su caso de uso normal, esa ventana es pantalla completa, excepto cuando ambos están ejecutando en el mismo equipo, simplemente por lo que es posible dar a la foco del controlador. En realidad, puede haber múltiples representadores que muestran una vista diferente de los mismos datos en diferentes computadoras controladas por el mismo controlador, por lo tanto, el desacoplamiento total de la entrada de la salida (Aprovechando las cosas incorporadas del cliente/servidor X11 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 zócalos.

+0

Eliminé la "respuesta" que condujo a la aclaración anterior ... Creo que la aclaración debe permanecer, pero cubre lo suficiente como para que mi pseudo-respuesta, que podría haber sido un comentario, se pueda eliminar por completo. –

Respuesta

7

bien, si eres menor de X11 y desea obtener la mbd, lo que necesita hacer un agarre. Si no es así, mi única buena respuesta es ncurses desde un terminal.

Así es como agarrar todo, desde el teclado y suelte 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; 
} 

Run esto desde un terminal y todos los eventos kbd deben golpearlo. Lo estoy probando bajo Xorg pero usa mecanismos Xlib venerables y estables.

Espero que esto ayude.

tener cuidado con juego bajo X. Cuando eres nuevo en ellos, a veces es una buena idea para iniciar un proceso de retardo de tiempo que el servidor ungrab cuando estás código de prueba y dejar que repose y correr y desabrocha cada par de minutos. Se ahorra tener que matar o cambiar del servidor al estado de reinicio externo.

Desde aquí, le dejo a usted decidir cómo multiplexar renderes. Lea los documentos de 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. XWarpPointer puede empujar el puntero a uno de ellos también desde el código.

Un punto más: puede agarrar el puntero y otros recursos. Si tenía un controlador ejecutándose en la caja en frente de la cual se sienta, podría usar la entrada de teclado y mouse para alternar entre tomas abiertas con diferentes representadores.Ya no deberías necesitar cambiar el tamaño de la ventana de salida a menos de la pantalla completa con este enfoque. Con más trabajo, podría colocar superposiciones combinadas alfa en la parte superior utilizando las extensiones SHAPE y COMPOSITE para obtener una buena función de superposición en respuesta a la entrada del usuario (que podría contar como dorado del lirio).

+0

Esta respuesta + la respuesta GPM de Brian responde mi pregunta, pero solo puedo seleccionar 1 respuesta. – rck

+0

Tenga en cuenta que GPM probablemente no interactuará cómodamente con X activo en el mismo terminal ... lea cuidadosamente el final de la página de manual "ERRORES". Incluso si parece viable, iría al servidor X para ambos tipos de eventos. –

2

Para el mouse puede usar GPM.

No estoy seguro de la parte superior de la cabeza para el teclado o el joystick.

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

creo que sirve

Cuestiones relacionadas