Pergunta

Há uma boa biblioteca para utilizar para a recolha de entrada do usuário no Linux através do mouse/teclado/joystick que não o força a criar uma janela visível para fazê-lo?SDL permite obter a entrada do usuário em uma maneira razoável, mas parece forçar você a criar uma janela, o que é problemático se você tem abstraídos de controle para a máquina do controle não precisa ser o mesmo que o render da máquina.No entanto, se o controle e processar as máquinas são as mesmas, isso resulta em uma feia pouco SDL janela na parte superior do ecrã.

Editar Para Esclarecer:
O processador tem uma janela de saída, em uso normal caso, a janela de ecrã total, exceto quando eles são executados no mesmo computador, só assim é possível dar o controlador de foco.Há, na verdade, pode ser de vários renderizadores de apresentar uma visão diferente sobre os mesmos dados em diferentes computadores, todos controlados pelo mesmo controlador, daí a total dissociação da entrada a partir da saída (Tomada de tirar vantagem do X11 client/server coisas para exibir menos utilizável) Também, várias aplicações do controlador para um processador também é possível.A comunicação entre os controladores e processadores é através de sockets.

Foi útil?

Solução

OK, se você está sob o X11 e você deseja obter o kbd, você precisa fazer uma garra.Se você não está, a minha única resposta boa é ncurses a partir de um terminal.

Aqui está como você pegar tudo, desde o teclado e o lançamento de novo:

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

Executar este a partir de um terminal e os kbd eventos devem atingi-lo.Eu estou testando ele em Xorg mas ele usa venerável, estável Xlib mecanismos.

Espero que isso ajude.

Tenha CUIDADO com grabs em X.Quando você é novo para eles, às vezes é uma boa idéia para começar um atraso de tempo do processo ungrab o servidor quando você está testando o código e deixá-lo sentar-se, correr e ungrab a cada dois minutos.Ele salva ter que matar ou mudar de longe o servidor externamente o estado reset.

A partir daqui, vou deixar para que você decida como multiplex renderes.Leia o XGrabKeyboard docs e XEvent docs para começar.Se você tem pequenas janelas expostas no ecrã cantos, você pudesse tocar o ponteiro do mouse em um canto para selecionar um controlador.XWarpPointer pode enfiar o ponteiro para um deles, bem como a partir de código.

Um ponto a mais:você pode pegar o ponteiro do bem, e de outros recursos.Se você tivesse um controlador de executar na caixa na frente de você sentar, você pode utilizar a entrada de teclado e mouse para alternar entre sockets abertos com diferentes processadores.Você não deve redimensionar a janela de saída para menos de ecrã inteiro mais com essa abordagem, sempre.Com mais de trabalho, você pode realmente cair alfa-misturado sobreposições na parte superior usando a FORMA e o COMPOSTO de extensões para obter um bom funcionalidade de sobreposição em resposta à entrada do usuário (que pode contar como douramento o lírio).

Outras dicas

Para o mouse, você pode usar GPM.

Eu não tenho certeza em cima da minha cabeça para teclado ou joystick.

Ele provavelmente não iria ser muito ruim para ler diretamente lá /dev arquivos, se necessário.

Espero que ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top