2012-07-02 25 views
8

Estoy haciendo una aplicación de consola para plataformas Unix, y estoy usando la biblioteca de curses (o ncurses) para manejar la entrada del teclado y el mouse. El problema es que he encontrado muy poca documentación sobre cómo usarlo exactamente para eso, aparte de this page y this one, que no tienen ejemplos muy detallados. He logrado capturar el clic izquierdo, pero no puedo hacer que funcione con el clic derecho porque el menú de opciones para el emulador de terminal aparece en la ubicación del cursor, pero la aplicación no procesa el evento. ¿Cómo puedo evitar esto y tener el evento capturado en la aplicación?Uso de ncurses para capturar clics del mouse en una aplicación de consola

que tienen la siguiente línea para la configuración de los eventos del ratón:

// Set up mouse event throwing 
mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL); 

Y en el método que procesa la entrada, tengo el siguiente:

int c = getch(); 
MEVENT event; 
switch(c) 
{ 
    case KEY_UP: 
     ... do stuff 
     break; 
    case KEY_DOWN: 
     ... do stuff 
     break; 
    case KEY_MOUSE: 
     if(getmouse(&event) == OK) 
     { 
      if(event.bstate & BUTTON1_PRESSED) // This works for left-click 
      { 
       ... do stuff 
      } 
      else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click 
      { 
       ... do other stuff 
      } 
      else 
       fprintf(stderr, "Event: %i", event.bstate); // Doesn't print anything on right-click 
     } 
     break; 
    default: 
     return; 
} 

También he intentado configurar mousemask() con la máscara ALL_MOUSE_EVENTS, pero todavía no imprime ningún evento en la última cláusula else, por lo que creo que el evento simplemente no se está disparando. Cualquier ayuda sobre esto sería muy apreciada.

+0

Parece que su emulador de terminal no pasa el evento de clic derecho a la ventana del terminal. La mayoría de los emuladores tienen opciones que desactivan el manejo especial de los dispositivos de entrada y permiten pasar eventos directamente a la terminal. –

+0

Bueno, he intentado ejecutarlo en varios terminales: el terminal predeterminado para Ubuntu 11.10, Guake, el terminal interno de NetBeans IDE, y ninguno de ellos funciona. ¿Sabes cómo podría configurar uno de esos para pasar los eventos a la aplicación? –

+4

http://askubuntu.com/questions/21330/how-to-disable-right-right-click-menu-in-terminal para una pregunta similar, tiene una respuesta parcial, es decir, use xterm. –

Respuesta

2

El botón derecho del mouse es el botón 3, no el botón 2. El botón 2 es el del medio.

+0

Sí, me di cuenta de eso, pero el evento aún no se había enviado a la aplicación. Pongo el evento del botón derecho en el último comentario de la pregunta. –

0

Estaba usando su código pero no puedo obtener ninguna reacción. Ni siquiera el botón izquierdo del mouse funciona.

¿Es este el código completo?

#include <ncurses.h> 

int main(int argc, char **argv){ 

while(1) 
{ 

    mousemask(ALL_MOUSE_EVENTS, NULL); 
     int c = getch(); 
     MEVENT event; 
     switch(c) 
     { 
      case KEY_UP: 
       printf("keyup"); 
       break; 
      case KEY_DOWN: 
       printf("keydown"); 
       break; 
      case KEY_MOUSE: 
       if(getmouse(&event) == OK) 
       { 
        if(event.bstate & BUTTON1_PRESSED) // This works for left-click 
        { 
         printf("button1"); 
        } 
        else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click 
        { 
         printf("button2"); 
        } 
        else 
         printf("Event: %i", event.bstate); // Doesn't print anything on right-click 
       } 
       break; 
     } 
} 
return 0; 
} 
+1

¿Viste el último comentario sobre la pregunta? ¿Estás utilizando Xterm y los eventos 'BUTTON0_CLICKED' y' BUTTON3_CLICKED' para los botones izquierdo y derecho? Los prensados ​​no funcionaron para mí. –

+0

El problema es que no tengo una ventana de terminal.Trabajo con Ubuntu sin cabeza sin ninguna gestión de ventanas ... – user1455085

+0

Supongo que entonces no tendrías el problema del menú contextual (no hay ninguno en headless). Debería funcionar con el shell predeterminado, aunque no puedo dar fe de eso. ¿Lo intentó con el código corregido? ¿Estás seguro de que el controlador del mouse se está ejecutando (quizás tu inicio sin cabeza no lo cargue de manera predeterminada porque generalmente no es necesario). –

9

Para cualquier otra persona que viene aquí tratando de averiguar por qué s/he pueden no capure eventos de ratón en absoluto con Ncurses, más probable es que esta es la línea que se necesita:

keypad(window, TRUE); 

Sin esto, no recibí ningún evento de mouse con getch().

Falta en todos los tutoriales/ejemplos que he visto, es por eso que me tomó mucho tiempo descubrir qué estaba mal con mi código; tal vez esta respuesta ayude a otros a encontrar la solución más rápido que yo.

+0

Esto parece solucionar el problema en mi entorno Debian/terminator. Sin ella, ningún evento parece dispararse. Creo que esta respuesta debería marcarme como correcta. –

+0

Esto lo arregla en OS X también. – AdUki

Cuestiones relacionadas