2011-09-18 21 views
7

Me pregunto si hay eventos de movimiento del mouse en NCurses, y si hay alguna forma de detectarlos. Siguiendo el Interfacing with the mouse (del NCurses programming HOWTO) parece que al habilitar el bit REPORT_MOUSE_POSITION en la llamada al mousemask, uno puede detectar eventos de movimiento del mouse.Eventos de movimiento de mouse en NCurses

Así que lo intenté y parece que no funciona. Tengo algo como esto:

int ch, count=0; 
mmask_t old; 

initscr(); 
noecho(); 
cbreak(); 
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old); 
keypad (stdscr, TRUE); 

while ((ch = getchar()) != 'q') 
{ 
    count++; 
    if (ch == KEY_MOUSE) 
    { 
    MEVENT event; 
    assert (getmouse (&event) == OK); 
    mvprintw (0, 0, "Mouse Event!\n"); 
    } 
    mvprintw (1, 1, "Event number %4d",count); 
} 

... 

que esperaba que a medida que voy a pasar mi cursor del ratón, voy a ver el contador de eventos cada vez mayor. Pero no fue así. También traté de moverlo mientras el botón del mouse 1 está abajo para ver si genera eventos de "arrastre", y tampoco hizo nada. La pregunta es, si es simplemente un problema de mi emulador de terminal? ¿O tal vez estoy malinterpretando lo que NCurses considera como eventos de movimiento del mouse? Todos los demás eventos del mouse se recibieron (y puedo operar programas en la consola que usan el mouse).

Probé gnome-terminal, xterm y algunas otras cosas. También probé un entorno textual (sin X) yendo a los tty de mi máquina Linux (Fedora 15, Ctrl + Alt + F2) y eso no funcionó.

Finalmente, suponiendo que lo entiendo bien y esos eventos deben ser informados, ¿cuál es el campo bstate de un MEVENT para un movimiento de ratón evenet?

¡Muchas gracias de antemano!

Respuesta

16

que necesita:

  1. un terminal que soporta evento de ratón de informes;
  2. $TERM apuntando a una entrada terminfo que tiene una entrada XM apropiada para inicializar correctamente el terminal.

xterm al menos cumple (1); para (2), es probable que deba establecer un valor diferente para TERM.

Probar:

  • TERM=xterm-1002 para conseguir un evento de posición cuando el cursor se mueve a una celda diferente, mientras que un botón se mantiene presionado; o
  • TERM=xterm-1003 para obtener siempre un evento de posición cada vez que el cursor se mueve a una celda diferente, incluso si no se presiona ningún botón.

Los eventos resultantes tienen el bit REPORT_MOUSE_POSITION establecido en el campo bstate.

(La sección "PORTABILIDAD" de la página curs_mouse(3x) hombre describe la inicialización del terminal, y la sección de "seguimiento del ratón" de la documentación Xterm Control Sequences describe las extensiones "modo privado" relevantes.)

El código que ha' ve dado anteriormente necesita usar getch(), no getchar(); y necesita un refresh() dentro del ciclo Aparte de eso, funciona para mí con xterm cuando se utiliza uno de los ajustes apropiados TERM.

+0

Escribí getchar en stackoverflow accidentalmente, mi código real no usó getch.Me salté la actualización de nuevo cuando escribí el pseudo código aquí: P De todos modos, muchas gracias, ¡tu sugerencia con xterm funcionó muy bien! –

Cuestiones relacionadas