2008-09-24 10 views
5

En primer lugar, sí sé de this question, pero estoy buscando un poco más de información que eso. De hecho, tengo un problema bastante similar, ya que necesito poder capturar la entrada para el mouse/teclado/joystick, y también me gustaría evitar SDL si es posible. Me preguntaba más o menos si alguien sabe dónde puedo obtener algunos iniciadores decentes para manejar la entrada de dispositivos en Linux, tal vez incluso algunos tutoriales. SDL funciona muy bien para el manejo de entrada multiplataforma, pero no voy a usar nada más de SDL, así que me gustaría cortarlo por completo. Sugerencias, comentarios y ayuda son todos apreciados. ¡Gracias!Capturar entrada en Linux

Editar para mayor claridad:

El punto es captar el movimiento del ratón, teclado pulse/liberación, los clics del ratón, palanca de mando y potencialmente el manejo de un juego.

+0

Siento que esta pregunta es bastante amplia. ¿Hablar directamente con el dispositivo de entrada? (Por lo general, es una mala idea para una aplicación de alto nivel.) ¿Utiliza X? (Si X, ¿quieres Xlib, XCB, Gtk +, Qt, ...) GPM para el mouse en modo consola? – asveikau

Respuesta

5

Utilizando el siguiente enlace vistazo a la función void kGUISystemX :: Loop (void)

Ésta es mi principal lazo para conseguir la entrada a través del teclado y el ratón utilizando X Windows en Linux.

http://code.google.com/p/kgui/source/browse/trunk/kguilinux.cpp

Aquí hay un fragmento:

if(XPending(m_display)) 
    { 
     XNextEvent(m_display, &m_e); 
     switch(m_e.type) 
     { 
     case MotionNotify: 
      m_mousex=m_e.xmotion.x; 
      m_mousey=m_e.xmotion.y; 
     break; 
     case ButtonPress: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=true; 
      break; 
      case Button3: 
       m_mouseright=true; 
      break; 
      case Button4:/* middle mouse wheel moved */ 
       m_mousewheel=1; 
      break; 
      case Button5:/* middle mouse wheel moved */ 
       m_mousewheel=-1; 
      break; 
      } 
     break; 
     case ButtonRelease: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=false; 
      break; 
      case Button3: 
       m_mouseright=false; 
      break; 
      } 
     break; 
     case KeyPress: 
     { 
      XKeyEvent *ke; 
      int ks; 
      int key; 

      ke=&m_e.xkey; 
      kGUI::SetKeyShift((ke->state&ShiftMask)!=0); 
      kGUI::SetKeyControl((ke->state&ControlMask)!=0); 
      ks=XLookupKeysym(ke,(ke->state&ShiftMask)?1:0); 
...... 
1

Usted no especificaron el propósito de su aplicación, pero la lectura de datos en bruto de los dispositivos de entrada rara vez es lo que quiere a menos que sólo lo hacen por diversión (o proyecto de la escuela o lo que sea)

Si está escribiendo una aplicación GUI (una que se ejecuta en un entorno gráfico X11) puede confiar en los kits de herramientas gráficas (o X sin procesar) de los controladores de entrada.

Si está escribiendo un cliente de modo de texto, entonces quizás readline o incluso ncurses podrían ser buenas alternativas.

2

Si sabe que su proyecto solo se ejecutará bajo Linux (no Windows o incluso uno de los BSD), debe buscar en el sistema de entrada del kernel de Linux. Descargue el kernel source y lea Documentation/input/input.txt, particularmente la descripción del sistema evdev.

Para una solución significativamente más alta (y más portátil), read up on Xlib. Obviamente, requiere un servidor X en ejecución, pero tiene la ventaja de heredar la configuración del teclado del usuario. Desafortunadamente, los eventos de joystick no están incluidos, probablemente necesite usar la API de joystick del kernel.

-1

Usted puede obtener el aporte directo de los archivos en/dev/input. Esta es la forma más sencilla de hacerlo, y no necesita ningún software adicional.

Cuestiones relacionadas